基于外键的双向一对一关系映射 表结构: 类Person和类IdCard
public class Person { private int id; private String name; private int age; private IdCard idCard; //get…set } public class IdCard{ private int id; private String code; private Person person; //get…set }person.hbm.xml
<hibernate-mapping package="cn.siggy.pojo"> <class name="Person"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <property name="age"/> <!-- 当unique设置为true时候可以设置一对一的关系 --> <many-to-one name="idCard" class="IdCard" cascade="save-update" column="idCard_Id" foreign-key="fk_idCard" not-null="true" unique="true"> </many-to-one> </class> </hibernate-mapping>IdCard.hbm.xml(重点来了)
<hibernate-mapping package="cn.siggy.pojo"> <class name="IdCard"> <id name="id"> <generator class="native"></generator> </id> <property name="code"/> <one-to-one name="person" property-ref="idCard"/> </class> </hibernate-mapping>重点 重点就是理解为什么一的一端这么配置。 person有一个属性是IdCard,IdCard里面又有一个属性是person就是自己,所以在IdCard配置one-to-one的时候直接property-ref为many to one的name即可,可以看表结构,是相互参照的关系。
基于主键的双向一对一关系映射 类得写法不变 person.hbm.xml
<hibernate-mapping package="cn.siggy.pojo"> <class name="Person"> <id name="id"> <!-- foreign表示引用外键 --> <generator class="foreign"> <!-- 引用idCard属性所对应的主键 --> <param name="property">idCard</param> </generator> </id> <property name="name"/> <property name="age"/> <!-- 一对一 --> <one-to-one name="idCard" constrained="true" cascade="save-update"/> </class> </hibernate-mapping>IdCard.hbm.xml 加一句one to one即可
<hibernate-mapping package="cn.siggy.pojo"> <class name="IdCard"> <id name="id"> <generator class="native"></generator> </id> <property name="code"/> <one-to-one name="person"/> </class> </hibernate-mapping>基于主键和外键区别其实就是基于主键已经知道了是主键来互相参照,所以不用多写名称,直接写one to one即可,而基于外键在一的一端要告诉参照哪个外键,所以指明关系字段的name。