如:person与idCard
基于外键的one-to-one可以描述为多对一。
hibernate 一对一唯一外键关联映射(双向关联 Person<---->IdCard )
一对一唯一外键 双向 关联,需要在另一端(person ),添加 <one-to-one> 标签,指示 hibernate 如何加载 其关联对象,默认根据主键加载idcard ,外键关联映射中,因为两个实体采用的是 idcard 的外键维护的关系, 所以不能指定主键加载 idcard ,而要根据 idcard 的外键加载,所以采用如下映射方式:
<one-to-onename="idcard" property-ref="person"/>
id_card表中有一个person_id的外键。
实体类和根据共享主键方式中的一样,不变。
Person.hbm.xml:
<hibernate-mapping> <class name="cn.framelife.hibernate.entity.Person" table="person" catalog="hibernate"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="name" length="45" not-null="true" /> </property> <!-- 没有下面的one-to-one标签也行,但那样就变成了单向关联(IdCard ----》 Person) ,也就是当知道IdCard后,能找到它属于的对应的人,但知道某人后,却无法找到相对应的IdCard--> <one-to-one name="idCard" property-ref="person"/> </class> </hibernate-mapping>
IdCard.hbm.xml:
<hibernate-mapping> <class name="cn.framelife.hibernate.entity.IdCard" table="id_card" catalog="hibernate"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native" /> </id> <property name="cardNo" type="java.lang.String"> <column name="card_no" length="45" not-null="true" /> </property> <!-- 指定多的一端的unique=true,这样就限制了多的一端的多重性为一 通过这种手段映射一对一唯一外键关联 --> <many-to-one name="person" column="person_id" unique="true" /> </class> </hibernate-mapping>
增加与查询操作和结果都与共享主键方式中是一样的