人圭先生 2016-01-18
hibernate中一一关系映射
1.基于外键的一对一关联映射:
1.单向的关联映射
单向的关联映射中,主控端知道关联的另一表是谁,而被控端不知道被谁给关联了。
怎么配置呢?
在数据持久化类当中,被控端与无关联时候一样的写法,主控端则是应用被控端的对象,并实现get/set方法
Xxx.hbm.xml中,被控端也无需任何的改变,主控端则是添加<many-to-one></many-to-one>标签,
其中name值为应用被控端属性的属性名 column值为外键名 unique属性值来决定是否是一一对应,true则是一一对应,false否
持久化对象Java
被控端:
public class Address { private int id; private String addr; //省去get/set方法 }
主控端:
public class Account { private int id; private String name; private Address address; //省去get/set方法 }
Xxx.hbm.xml文件配置:
被控端:
<hibernate-mapping> <class name="com.usc.geowind.lilin.bean.Address" table="Adress"> <id name="id" column="id" > <generator class="native"></generator> </id> <property name="addr" column="addr"></property> </class> </hibernate-mapping>
主控端:
<hibernate-mapping> <class name="com.usc.geowind.lilin.bean.Account" table="Account"> <id name="id" column="id" > <generator class="native"></generator> </id> <property name="name" column="name"></property> <!-- name值为对象中属性名 coulumn为外键 unique为是否一对一 --> <many-to-one name="address" column="address_id" unique="true"></many-to-one> </class> </hibernate-mapping>
2.双向的关联映射
双向的关联映射当中,主控端知道关联的另外一端是谁,而且被控端也知道被谁给关联上了。
在双向关联时候,主控端的设计与单向关联是无异,被控端中,持久化对象中添加主控端的对象引用,
Xxx.hbm.xml文件中添加标签<one-to-one></one-to-one>,属性property-ref的值为主控端引用被控端的属性属性名
被控端:
public class Address { private int id; private String addr; private Account account; //省去get/set方法 }
Xxx.hbm.xml文件配置:
在字段属性下添加该属性,其余不变
<hibernate-mapping> <class name="com.usc.geowind.lilin.bean.Address" table="Adress"> <id name="id" column="id" > <generator class="native"></generator> </id> <property name="addr" column="addr"></property> <!-- onetoone 指定一一关联 property-ref 反向引用主控端的属性名,而不是外键 --> <one-to-one name="account" property-ref="address"></one-to-one> </class> </hibernate-mapping>
2.基于主键的关联映射:
1.单向的关联映射
基于主键的关联映射是两表不依靠外键,靠被另一表的主键来实现的一一映射关系。
被控端的配置与基于外键的被控端的配置一样,但是主控端的配置却有着相当大的区别。
在持久化的对象当中,还是要引用被控端的对象,在Xxx.xml文件配置中,主键的配置如下:
<!-- 外键 --> <generator class="foreign"> <!-- 指明外键的属性值,被引用的对象的属性名 --> <param name="property">idCard</param> </generator>
并且引用外键的标签使用<one-to-one></one-to-one>,其中的属性constrained的值设置为true,是告诉当前的主键使用的是被控端的主键
持久化对象Java
主控端:
public class CItizen { private int id; private String name; private IDCard idCard; //省去get/set方法 }
被控端:
public class IDCard { private int id; private int num; //省去get/set方法 }
Xxx.hbm.xml文件配置:
主控端:
<hibernate-mapping> <class name="com.usc.geowind.lilin.bean.onetoonePK.CItizen" table="CItizen"> <id name="id" column="id"> <!-- 外键 --> <generator class="foreign"> <!-- 指明外键的属性值,被引用的对象的属性名 --> <param name="property">idCard</param> </generator> </id> <property name="name" column="name"></property> <!--constrained 是否告诉当前主键你的值是另外一个表的之间值 --> <one-to-one name="idCard" constrained="true"></one-to-one> </class> </hibernate-mapping>
被控端:
<hibernate-mapping> <class name="com.usc.geowind.lilin.bean.onetoonePK.IDCard" table="IDCrad"> <id name="id" column="id"> <generator class="native"></generator> </id> <property name="num" column="num"></property> </class> </hibernate-mapping>
2.双向的关联映射
在配置上与基于主键的单向关联关系的区别:
在JavaBean对象中,引用主控端的对象并实现get/set方法。在Xxx.hbm.xml文件配置:
继续使用<one-to-one></one-to-one>标签
实例:
被控端:
public class IDCard { private int id; private int num; private CItizen cItizen; //省去get/set方法 }
Xxx.hbm.xml中,在属性字段中添加标签
<one-to-one name="cItizen"></one-to-one>就可