为了简洁,我们创建两张表分别是Student和Certificate,它们只有主键ID和另外一个对象的引用标识符。
从student可以加载certificate。单向
Certificate Student.getCer();//返回Certificate对象
Student Certificate.gerStu();//返回Student对象
1.主键关联
所谓以主键关联,是指两张数据库表通过主键取得一对一的关联关系,也就是说一张表的主键是引用另一张表的外键。例如,对于Student和Certificate对象,一般来说是Student是主体,Certificate对象依附Student存在。它们主键关联的一对一关系就是在数据库中Student和Certificate表使用相同的主键值,这个由Student对象生成。Certificate应用这个主键值。它们共享同一主键值,这通过在Certificate表中设置外键来实现。
一对一主键关联映射中默认cascade="true";
2.一对一以主键关联的使用
既然它们是共用一个主键值,关键是如何让另一张表引用已经生成的主键值。这在Hibernate中使用的是主键的foreign生成机制。
下面是Student和Certificate类的配置源码。
Student.hbm.xml
<hibernate-mapping>
<class name="model.Student" table="student" lazy="true"><!--把类数表关联起来-->
<id name="id" unsaved-value="null"><!--id的产生方式是uuid.hex-->
<generator class="uuid.hex" />
</id>
<property name="name" type="String"><!--映射学生名-->
<property name="carId" type="String"><!--映射映射号-->
<property name="age" type="int"><!--映射学生年龄-->
<one-to-one name="cer"
class="model.Certificate"
fetch="join" cascade="all" constrained="true"/><!--映射文件的身份证对象-->
</class>
</hibernate-mapping>
以上的one-to-one设置为cascade="all",表示增加、删除、及修改Student对象时,都会级联增加、删除、修改Certificate对象。
constrained="true"约束这句话也要加上
Certificate.hbm.xml
<hibernate-mapping>
<class name="model.Certificate" table="certificate" lazy="true"><!--把类数表关联起来-->
<id name="id">
<!--外键生成机制,引用stu对象的主键作为certificate数据表的主键和外键-->
<generator class="foreign">
<param name="property">stu</param>
</genetator>
</id>
<property name="describe" column="describe"type="String">
</class>
</hibernate-mapping>
上述的两个配置文件在one-to-one中都没有设置column属性(其实他本身就没有column属性)。两个表是通过主键值得以连接的。现在建立一个学生和身份证对象,将他们设置为一对一关联存入数据库。
//建立身份证
Certificate cer = new Certificate();
cer.setDescribe("spark");
//新建学生
Student stu = new Student();
stu.setName("spark");
stu.setCardid("10001");
stu.setAge(22);
//设置学生和身份证之间的关联
stu.setCer(cer);
StudentDAO.saveObj(stu);