zoukankan      html  css  js  c++  java
  • 【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映射的基本原理。一对一主键关联映射使用的情况不多,因为它使用主键关联,扩展性差。一对一唯一外键关联是多对一的特殊情况,下篇将介绍一对多关联映射。

                

  • 相关阅读:
    What is the difference between Serialization and Marshaling?
    IEEE Standard 754 for Binary Floating-Point Arithmetic
    没有单元测试,就很难有真正的积累。
    一般只用 20% 的代码就可以解决 80% 的问题。但要想解决剩下 20% 的问题的话,则需要额外 80% 的代码。
    为失败设计,大量引入对SRE的理解,鲁棒性高
    用git合并分支时,如何保持某些文件不被合并
    git 分支合并时如何忽略某个文件
    Golang拼接字符串的5种方法及其效率_Chrispink-CSDN博客_golang 字符串拼接效率 https://blog.csdn.net/m0_37422289/article/details/103362740
    Lua大量字符串拼接方式效率对比及原因分析
    干货 | 携程多语言平台-Shark系统的高可用演进之路
  • 原文地址:https://www.cnblogs.com/victor-grace/p/7253659.html
Copyright © 2011-2022 走看看