Person表和IdCard一个人只能对应一个卡号,一个卡号只能对应一个人.
1.Person.hbm.xml
<hibernate-mapping package="com.sing.hibernate.entity"> <class name="Person" table="s_person"> <!-- 一对一主键关联映射,让两个实体对象的id保持相同,这样就可以保证多余的字段被创建了 --> <id name="id" column="s_id"> <!-- person的主键来源于idCard --> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name" column="s_name" /> <!-- 表示怎么加载关联对象,也同时表示了关联关系,默认根据主键加载 constrained="true",表明当前主键上存在一个约束,person的主键作为外键参照idCard --> <one-to-one name="idCard" constrained="true" /> <!-- 一对一关键第二种方式如下 使用多对一的方式,再把当前列设置唯一,且不能为null,这要也保证了一对一 如果改成了这样,就必须把id里面的generator的生成策略改变 IdCard映射不需做更改 但如果是一对一我个人认为采用主键最好 <many-to-one name="idCard" unique="true" not-null="true" /> --> </class> </hibernate-mapping>
2.IdCard.hbm.xml
<hibernate-mapping package="com.sing.hibernate.entity"> <class name="IdCard" table="s_id_card"> <id name="id" column="s_id"> <generator class="sequence"> <param name="sequence">s_id_card_seq</param> </generator> </id> <property name="cardNo" column="s_card_no" /> <!-- 加入one-to-one标签,指向Person,指向hibernate如何加载person,默认根据主键加载 --> <one-to-one name="person" /> <!-- 一对一唯一键关联双向,表示当前表的主键即s_id与Person表中的idCard相比较 <one-to-one name="person" property-ref="idCard" /> --> </class> </hibernate-mapping>
3.测试保存方法
@Test public void save() { Session session = HibernateUtil.getSession(); try { session.beginTransaction(); IdCard idCard = new IdCard(); idCard.setCardNo("88888888"); Person p1 = new Person(); p1.setName("邹勇"); p1.setIdCard(idCard); /* * 在这里不会出现异常 一对一主键关联映射中默认了cascade属性为true * 保存Person时会自动先保存IdCard */ session.save(p1); session.getTransaction().commit(); } catch (Exception e) { session.getTransaction().rollback(); } finally { HibernateUtil.closeSession(); } }