zoukankan      html  css  js  c++  java
  • hibernate关联映射

     关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用。  

      一、Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端。

      比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系。

      

      1、“多”端实体加入引用“一”端实体的变量及getter,setter方法。

      比如说多个学生对应一个班级,在学生实体类加入:private Grade grade;

      2、“多”端配置文件,student.hbm.xml里的标签设置:<many-to-one name="grade" column="gradeId" ></many-to-one>

      二、Hibernate单向的一对一主键关联映射:就是让两个实体的主键一样,就不需要加入多余的字段了。

      比如一个学生对应一个身份证号,一个学生对应一条户口信息等等,都是一对一关联映射。

      

      1、Person实体里要持有IdCard的引用。在Person实体里加入属性:Private IdCard idCard;

      2、Person端维护关系,所以需要重点看Person的配置文件,Person.hbm.xml通俗来讲 ,就是就是Person中的Id既为主键又为外键。

        所以需要修改Person中的id标签:通俗来讲是告诉Person里的id去关联哪个实体里的id。

        此处的foreign生成策略,会取得关联对象的标识。

        此处的property标签内是关联对象。

        

    <id name="id">
        <generator class="foreign">
            <param name="property">idCard</param>
        </generator>
    </id>

        

       

      3、在Person.hbm.xml中添加关联关系的标签:<one-to-one name="idCard" constrained="true"><one-to-one/>

        这里的one-to-one标签指示hibernate如何加载其关联对象,默认根据主键加载也就是拿到关系字段值,根据对端的主键来加载关联对象。

        这里的constrained="true"表示当前主键Person的id主键,还是一个外键,参照了对应端的主键IdCard的id主键,会生成外键约束语句。

        注:采用foreign映射策略在保存person对象的同时也会保存关联的对象,也就是idCard,他们之间还有级联关系。但是反之就不可以,也就是说,如果只保存IdCard对象,是会出错的,不会保存Person对象,因为关系的维护端在Person端,IdCard根本就不知道Person的存在。主键关联映射有弊端,不好维护。

      三、Hibernate双向一对一关联映射:有些需求要求从一端可以查到另一端,从另一端又可以查到这一端,就需要双向的关联映射。

      比如说,想要根据人的信息查到他的户口信息,也想根据户口信息查到这是哪个人的信息等。

      

      1、修改对象模型,在IdCard.java 的实体里加入Person的引用,添加属性:private Person person;(在Person.java实体里也有IdCard的引用哦)

      2、修改IdCard.hbm.xml文件,添加one-to-one标签。

      

    <one-to-one name="person"/>

      注1:one-to-one标签不影响存储,只影响加载,不会修改数据库,也就是说不会添加字段,而many-to-one会修改数据库,会增加一个字段。

      注2:了解抓取策略:fetch="select" 可以控制查取数据的顺序。

       四、单向一对一唯一外键关联映射:一对一主键关联不好维护,用外键关联对象比较好。原理:多对一的特殊情况。

      比如说还是Person和IdCard的例子。

      1、Person.java是实体里有IdCard的引用,即加入属性:private IdCard idCard;IdCard.java里没有Person引用。

      2、配置文件:IdCard.hbm.xml里都是普通属性。Person.hbm.xml的主键生成策略需要改变:改回:

      

    <generator class="native"/>

      使用标签many-to-one和unique  : <many-to-one name="idCard" unique="true"/> ,这样就限制了多的一端的唯一性。

      注:这里需要先保存IdCard.否则报错。

      五、双向一对一唯一外键关联:如果有需求要求的情况下,也可以建立双向的外键关联。

      1、在Person和IdCard里添加对应端的引用,即添加相应属性。

      2、person.hbm.xml和例子(四)中一样,修改IdCard.hbm.xml文件,添加one-to-one标签:<one-to-one name="person" property-ref="idCard"></one-to-one>.

      注:必须指定one-to-one标签中的property-ref属性为关系字段的名称。

      六、Hibernate单向一对多关联映射:让一的一端维护关系,和多对一的映射原理是一样的,都是在多的一端加入一个外键指向一的一端;

        区别在于维护的关系不同:

    • 多对一维护的关系:多指向一的关系,如果维护了多指向一的关系,那么加载多的一端的时候会把一的一端加载上来;
    • 一对多维护的关系:一指向多的关系,如果维护了一指向多的关系,那么加载一的一端的时候会把多的一端加载上来。

      比如说一个班里有多名学生。

      1、Classes.java 和 Student.java里各有两个普通属性id和name。在Classes里加入新属性:private Set students;

      2、映射文件的修改:Classes.hbm.xml里除了普通属性,加入集合映射:

      

    <set name="students">
        <key column="classesid"></key>
        <one-to-many class="com.juyahong.hibernate.Student"/>
    </set>

      注1:“一”的一端维护关系。

      注2:session.save(student),session.save(classes),保存student和classes对象。可以成功保存数据,但是需要发出多余的update语句来维持关系。

  • 相关阅读:
    PS3 可播放的多媒体类型
    VB个性化文件夹图标
    Delphi源码:编辑长求字符串相似度
    Delphi使用zlib来压缩文件
    汉字编码问题
    Silverlight 3 学习概要
    asp.net下大文件上传知识整理
    DHTML动态创建一个弹出遮罩层
    Delphi的运算符重载
    Windows Vista 交互式服务编程
  • 原文地址:https://www.cnblogs.com/tripoon/p/6068154.html
Copyright © 2011-2022 走看看