在学习Hibernate关联映射之前,首先了解一下ORM。ORM,全称是(Object Relational Mapping),即对象关系映射,ORM的实现思想是实现程序对象到关系数据库数据的映射。这样开发人员对数据库的操作,转换为对象操作。而Hibernate正是实现了这种思想,我们只需要操作对象即可完成对数据库的操作。下面我们开始对Hibernate关联映射进行细致学习。
首先介绍一下Hibernate一对一关联映射,一对一关联主要有两种策略:一对一主键关联、一对一唯一外键关联。
1、一对一主键关联:
即两对象之间一对一的关系,通过主键进行管理,不需要引入额外的键值对两者关系进行维护。实例:人(Person)--身份证(IdCard)
具体实现(只提供核心代码):
实体类:Person.java(类中的get和set方法省略,但这个必须有)
/** * @author victor * @date 2016-8-27 上午9:36:56 * 类说明 :Person实体类 */ public class Person { private int id; private String name; //引用idCard private IdCard idCard; }IdCard.java类:
/** * @author victor * @date 2016-8-27 上午9:39:29 * 类说明 :IdCard实体类 */ public class IdCard { private int id; private String cardNo; }映射文件:
Person.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.tgb.hibernate.Person" table="t_person_pk1"> <id name="id"> <!-- 主键生成策略:依据的是idCard的主键,其对应是one-to-one标签 --> <!-- 采用foreign生成策略,forgeign会取得关联对象的标识 --> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name" /> <!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载 也就是拿到关系字段值,根据对端的主键来加载关联对象 --> <!-- constrained="true表示,当前主键(person的主键)还是一个外键 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句 --> <!-- 此处的name值对应Person.java类中的关联值 --> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping>IdCard.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.tgb.hibernate.IdCard" table="t_id_card_pk1"> <id name="id"> <generator class="native" /> </id> <property name="cardNo" /> </class> </hibernate-mapping>注意:核心代码基本上都在Person.hbm.xml映射文件中,其主键的生成设置、one-to-one标签的值设置以及constrained属性的作用。此处实现的是单端关联,即从Person端关联IdCard端,在IdCard端配置上Person信息即可完成双向关联。需要注意是双向关联时,最好是只用一端维护数据, 另一端只提供查询,具体设置后边会说明。
2、一对一唯一外键关联
即通过在一端加上另一端的主键作为外键进行管理。例如:在Person中加入IdCard中的idCard 作为外键进行管理。
具体实现:本次实例使用双向关联
实体类:Person.java ,没有变化,与一对一主键关联相同
IdCard.java:加入Person类的引用。
映射文件:
Person.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table="t_person"> <id name="id"> <!--使用自增主键--> <generator class="native"/> </id> <property name="name"/> <!--本质是多对一,在person端加入idCard端的主键作为外键。使用unique来限制唯一性--> <many-to-one name="idCard" unique="true"/> </class> </hibernate-mapping>IdCard.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <!--与person关联--> <one-to-one name="person" property-ref="idCard"/> </class> </hibernate-mapping>注意:一对一唯一外键关联实质上是多对一的特殊情况,需要使用many-to-one标签,然后使用unique属性来设置该外键的唯一性。
通过实例操作,真正体会到使用对象来实现对数据库的操作,知道了ORM映射的基本原理。一对一主键关联映射使用的情况不多,因为它使用主键关联,扩展性差。一对一唯一外键关联是多对一的特殊情况,下篇将介绍一对多关联映射。