public class Person { private String id; private String name; private IdCard idCard; //省略set、get方法 }IdCard类
public class IdCard { private String id; private String securityBureau; private Person person; //省略set、get方法 }Person.hbm.xml配置:
<hibernate-mapping> <class name="com.tgb.Person" table="Persons"> <id name="id" column="id" type="string"> <!--这里生成策略不要纠结,假设它产生身份证号码--> <generator class="uuid"></generator> </id> <property name="name" column="name" type="string"></property> <!--使用<one-to-one>表示一对一关联--> <one-to-one name="idCard" class="com.tgb.IdCard" cascade="all"></one-to-one> </class> </hibernate-mapping> <span style="font-family: FangSong_GB2312; background-color: rgb(255, 255, 255);"> </span>IdCard.hbm.xml配置:
<hibernate-mapping> <class name="com.tgb.IdCard" table="idCards" > <id name="id" column="id" type="String"> <generator class="foreign"> <param name="property">person</param> </generator> </id> <property name="securityBureau" column="securityBureau" type="string"></property> <!-- 一对一关联 --> <one-to-one name="Person" class="com.tgb.User" ></one-to-one> </class> </hibernate-mapping>
由于采用了主键关联方式,两张表的主键值须保持同步。这也就是说,我们只需为一张表设定主键生成策略,而另一张表的主键与之共享就可以了。但是idCards表中的主键id并不是参照persons表id的外键。
虽然在Pserson类和IdCard类之间有互相引用关系,但是数据库端persons和idCards表没有任何参照关系,只是当我们保存User对象时,若User中的idCard属性值不为NULL,此时Hibernate就会以Use.hbm.xml中使用的主键生成器生成的主键值作为向users表和idCards表中插入记录的主键值,此时保持了关联记录的主键值的同步(由输出的SQL语句可知这是由Hibernate处理的,数据库并不知情)
原文:http://blog.csdn.net/zhuojiajin/article/details/41628835