hibernate映射关系之一对一双向主键关联

2023-12-02 15:32

本文主要是介绍hibernate映射关系之一对一双向主键关联,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       双向和单向的区别,其实不在数据库,而在加载方向。按照我们Person和IdCard的例子,单向是Person通过拥有IdCard的实例可以加载IdCard,而双向不但Person可以加载IdCard,还使IdCard通过拥有Person实例来加载Person。数据库还是原来的数据库(两个共享主键的表),不同的是在IdCard实体类中增加Person类型的变量和在IdCard.hbm.xml中增加了对该变量的配置。

Person.java

package com.bawei.demo.one2one;/*** Person entity. @author MyEclipse Persistence Tools*/public class Person {private int id;private String name;private IdCard idCard;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public IdCard getIdCard() {return idCard;}public void setIdCard(IdCard idCard) {this.idCard = idCard;}}

IdCard.java

package com.bawei.demo.one2one;import java.util.HashSet;
import java.util.Set;public class IdCard {private int id;private String cardNo;private Person Person;public Person getPerson() {return Person;}public void setPerson(Person person) {Person = person;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCardNo() {return cardNo;}public void setCardNo(String cardNo) {this.cardNo = cardNo;}
}

Person.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.bawei.demo.one2one.Person" table="t_person"><id name="id"><!-- 采用foreign生成策略,foreign会取得关联对象的标识 因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略 foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。 再使用元素<param>的属性值指定相关联对象(这里Person相关联的对象为idCard,则标识符为idCard的id) 为了能够在加载person数据同时加载IdCard数据,所以需要使用一个标签<one-to-one>来设置这个功能。 --><generator class="foreign"><!-- property只关联对象 --><param name="property">idCard</param></generator></id><property name="name" /><!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载 也就是拿到关系字段值,根据对端的主键来加载关联对象 表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。 默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。) 我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true" --><one-to-one name="idCard" constrained="true" /></class>
</hibernate-mapping>


Idcard.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.bawei.demo.one2one.IdCard" table="t_idCard"><id name="id"><generator class="native"></generator></id><property name="cardNo" /><one-to-one name="person"  /></class>
</hibernate-mapping>


测试类:

package com.bawei.demo.test;import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;import com.bawei.demo.hib.HibernateSessionFactory;
import com.bawei.demo.one2one.BaseHibernateDAO;
import com.bawei.demo.one2one.IdCard;
import com.bawei.demo.one2one.Person;public class Demo {public void testSave1() {Session session = null;try {session = new BaseHibernateDAO().getSession();session.beginTransaction();// session.save(person);Person person = new Person();person.setName("张三");IdCard idCard = new IdCard();idCard.setCardNo("1111111111111111111");// 建立关联person.setIdCard(idCard);session.save(person);// 没有抛出TransientObjectException// 是由一对一关联映射的特性决定的,它必须先保存关联对象IdCard// 这样它采用foreign映射策略才能取得关联对象的标识// 也就是它默认了cascade属性IdCard idCard1 = (IdCard) session.get(IdCard.class, 1);System.out.println(idCard1);System.out.println(idCard1.getPerson());session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();session.getTransaction().rollback();} finally {}}public void testfind() {Session session = null;try {session = new BaseHibernateDAO().getSession();session.beginTransaction();IdCard idCard1 = (IdCard) session.get(IdCard.class, 1);System.out.println(idCard1.getCardNo());System.out.println(idCard1.getPerson().getName());session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();session.getTransaction().rollback();} finally {}}public static void main(String[] args) {new Demo().testfind();}
}




 

这篇关于hibernate映射关系之一对一双向主键关联的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445870

相关文章

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

org.hibernate.hql.ast.QuerySyntaxException:is not mapped 异常总结

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [select u from User u where u.userName=:userName and u.password=:password] 上面的异常的抛出主要有几个方面:1、最容易想到的,就是你的from是实体类而不是表名,这个应该大家都知道,注意

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

Oracle主键和外键详解及实用技巧

在 Oracle 数据库中,主键(Primary Key)和外键(Foreign Key)用于维护数据库表之间的数据完整性。 1. 主键(Primary Key) 主键是一列或多列,能够唯一标识表中的每一行。表中只能有一个主键,并且主键列不能为空(即 NOT NULL)。 特性: 唯一性:主键中的每一个值都是唯一的,不能重复。非空性:主键列不能包含 NULL 值。索引:Oracle 自动为

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理

数据依赖基础入门:函数依赖与数据库设计的关系

在数据库设计中,数据依赖 是一个重要的概念,它直接影响到数据库的结构和性能。函数依赖 作为数据依赖的一种,是规范化理论的基础,对数据库设计起着至关重要的作用。如果你是一名数据库设计的初学者,这篇文章将帮助你理解函数依赖及其在数据库设计中的应用。 什么是数据依赖? 数据依赖 是指同一关系中属性间的相互依赖和制约关系,它是数据库设计中语义的体现。在现实世界中,数据之间往往存在某种依赖关系,而这