上次我们大致介绍了一下hibernate的概念、作用等,知道了hibernate是一种持久化的ORM框架,那么在实际使用中我们是怎么来实现映射关系的呢,我们先一起来看看一对一关联的映射关系。
一个人对应一个地址。
//人
public class Person11fk {
private int personid;
private String name;
private int age;
private Address11fk address11fk;
//地址
public class Address11fk {
private int addressid;
private String addressdetail;
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_pk.Person11pk" table="PERSON_11pk">
<id name="personid" column="presonid">
<!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->
<generator class="foreign">
<!--关联持久化类的属性名-->
<param name="property">address11pk</param>
</generator>
</id>
<property name="name"/>
<property name="age"/>
<!--用于映射1-1关联-->
<one-to-one name="address11pk" constrained="true"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_pk.Address11pk" table="ADDRESS_11pk">
<id name="addressid">
<generator class="identity"/>
</id>
<property name="addressdetail"/>
</class>
</hibernate-mapping>
解说1: foreign :使用另外一个相关联的对象的标识符。为了确保两个对象的主键值相等。
解说2: one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk">
<id name="personid" column name="id">
<generator class="identity"/>
</id>
<property name="name"/>
<property name="age"/>
<!-- cascade="all":在保存person对象的时候,级联保存person对象关联的address对象 -->
<one-to-one name="address11pk" cascade="all" />
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk">
<id name="addressid" column name="id">
<!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->
<generator class="foreign">
<!--关联持久化类的属性名-->
<param name="property">address11pk</param>
</generator>
</id>
<property name="addressdetail"/>
<!-- 表示在address表存在一个外键约束,外键参考相关联的表person -->
<one-to-one name="person11fk" constrained="true" />
</class>
</hibernate-mapping>
解说1: cascade属性的可能值有
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
解说2: constrained=true,hibernate即会延迟加载sql,one-to-one的双向关联中,必须设置constrained=true,要不然会有重复数据读。
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk">
<id name="personid">
<generator class="identity"/>
</id>
<property name="name"/>
<property name="age"/>
<!--用来映射关联PO column是Address在该表中的外键列名,增加unique变成“1-1”-->
<many-to-one name="address11fk" column="addressId" unique="true"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk">
<id name="addressid">
<generator class="identity"/>
</id>
<property name="addressdetail"/>
</class>
</hibernate-mapping>
解说1:事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似。只需要将原来的many-to-one元素增加unique=”true”属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk">
<id name="personid">
<generator class="identity"/>
</id>
<property name="name"/>
<property name="age"/>
<!--用来映射关联PO column是Address在该表中的外键列名,增加unique变成“1-1”-->
<many-to-one name="address11fk" column="addressId" unique="true"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk">
<id name="addressid">
<generator class="identity"/>
</id>
<property name="addressdetail"/>
<!-- 必须制定property-ref为关系字段的名称 -->
<one-to-one name="person11fk" property-ref="address11fk"></one-to-one>
</class>
</hibernate-mapping>
解说1: property-ref: 在关联对象中用于与本对象关联的属性。
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_tab.Person11tab" table="PERSON_11tab">
<id name="personid">
<generator class="identity"/>
</id>
<property name="name"/>
<property name="age"/>
<!--使用join元素显式确定链接表-->
<join table="join_11tab">
<key column="personid"/>
<!--映射1-1关联属性,其中unique=“true”属性确定为“1-1”-->
<many-to-one name="address11tab" unique="true"/>
</join>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_tab.Address11tab" table="ADDRESS_11tab">
<id name="addressid">
<generator class="identity"/>
</id>
<property name="addressdetail"/>
</class>
</hibernate-mapping>
解说1: unique=true是指这个字段的值在这张表里不能重复,所有记录值都要唯一,就像主键那样
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_tab.Person11tab" table="PERSON_11tab">
<id name="personid">
<generator class="identity"/>
</id>
<property name="name"/>
<property name="age"/>
<!--使用join元素显式确定链接表-->
<join table="join_11tab" optional="true">
<key column="personid" unique="true"/>
<!--映射1-1关联属性,其中unique=“true”属性确定为“1-1”-->
<many-to-one name="address11tab" column="addressid" not-null="true" unique="true"/>
</join>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_tab.Address11tab" table="ADDRESS_11tab">
<id name="addressid">
<generator class="identity"/>
</id>
<property name="addressdetail"/>
<!--使用join元素显式确定链接表-->
<join table="join_11tab" optional="true">
<key column="addressid" unique="true"/>
<!--映射1-1关联属性,其中unique=“true”属性确定为“1-1”-->
<many-to-one name="person11tab" column="personid" not-null="true" unique="true"/>
</join>
</class>
</hibernate-mapping>
通过此次学习,我们知道了Hibernate中一对一关系映射的种类以及实现,但是在我们实际开发中最常用的还是一对多关系的处理,下次我们将一起学习Hibernate一对多关系的映射关系。敬请期待。