【Hibernate】--关联关系映射:一对一关联

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

            

原文地址:https://www.cnblogs.com/victor-grace/p/7253659.html