Hibernate一对一主键关联:
1,单向主键关联:person--------》idCard
Person的主键id作为一个外键参照idCard的主键id。键值都是一样的。
让两个实体的主键id保持相同,这样避免多余字段被创建。
Person.hbm.xml:
<hibernate-mapping>
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
//person的主键来源于idCard,共享idCard的主键。
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
//指示hibernate怎么加载他的关联对象idCard,默认根据主键加载
// constrained="true" 表示当前主键存在一个约束,Person的主键id作为一个外键参照idCard的主键id,如果去掉就不会生出外键关联约束
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
IdCard.hbm.xml:
<hibernate-mapping>
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
session.beginTransaction();
IdCard idCard = new IdCard();
idCard.setCardNo("88888888888888");
Person person = new Person();
person.setName("菜10");
person.setIdCard(idCard);
//没有保存idCard
//不会出现TransientObjectException异常
//因为一对一主键关联映射中,默认了cascade属性
//因为person的主键参考idCard的主键,必须先有idCard。
//只有一对一关联映射特殊
session.save(person);
session.getTransaction().commit();
2,双向主键关联:person 《--------》idCard
跟单向关联唯一不同的是:在另一端也加上one-to-one标签
<hibernate-mapping>
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
//指示hibernate如何加载person,默认根据主键加载
<one-to-one name="person"/>
</class>
</hibernate-mapping>