在学习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映射的基本原理。一对一主键关联映射使用的情况不多,因为它使用主键关联,扩展性差。一对一唯一外键关联是多对一的特殊情况,下篇将介绍一对多关联映射。