• 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语句来维持关系。

  • 相关阅读:
    ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
    iOS UI 12 block传值
    iOS UI 11 单例
    iOS UI 08 uitableview 自定义cell
    iOS UI 07 uitableviewi3
    iOS UI 07 uitableviewi2
    iOS UI 07 uitableview
    iOS UI 05 传值
    iOS UI 04 轨道和动画
    iOS UI 03 事件和手势
  • 原文地址:https://www.cnblogs.com/tripoon/p/6068154.html
Copyright © 2020-2023  润新知