`

Hibernate 关联关系映射(Association Relationship Mapping)

 
阅读更多

一对一主键关联

数据表为:夫妻表

Hibernate 关联 - 低调的华丽 - 辉色空间

 POJO 为:

Hibernate 关联 - 低调的华丽 - 辉色空间
 

 映射文件为:

Husband.hmb.xml

<class 
           name="com.demo.hibernate.beans.Husband" 
           table="t_husband"
           lazy="false"
>

    <id name="id" 
           type="java.lang.Integer" 
           column="id"
    >

          <generator class="increment" />
    </id>

    <property name="name"
               type="java.lang.String"
               column="name"
               length="50"
    />
     <one-to-one name="myWife" class="com.demo.hibernate.beans.Wifecascade="all"/> <!--配置映射-->

</class>

Wife.hbm.xml

<class 
    name="com.demo.hibernate.beans.Wife" 
    table="t_wife"
    lazy="false"
>
    <id
        name="id"
        type="java.lang.Integer"
        column="id"
    >
        <generator class="foreign" >    <!--主键作为与Husband 对象关联的外键-->
                     <param name="property">myHusband</param> <!--主键的值是由Husband的主键赋给-->
         </generator>
    </id>

    <property
                name="name"
                type="java.lang.String"
                column="name"
                length="50"
    />
    <one-to-one name="myHusband" class="com.demo.hibernate.beans.Husbandcascade="all"> <!--配置关联映射-->

</class>

插入一条记录:

  Husband husband = new THusband();
  husband.setName("杨过");
  
  Wife wife = new Wife();
  wife.setName("小龙女");
  
  husband.setMyWife(wife);
  wife.setMyHusband(husband);

session.save(husband);

 session.merge(father) (×)

一对一外键关联

数据表为:父子表

Hibernate 关联 - 低调的华丽 - 辉色空间

POJO 为:

Hibernate 关联 - 低调的华丽 - 辉色空间

映射文件:

Father.hbm.xml

<class 
    name="com.demo.hibernate.beans.Father" 
    table="t_father"
    lazy="false"
>

    <id
        name="id"
        type="java.lang.Integer"
        column="id"
    >
        <generator class="increment" />
    </id>

    <property
              name="name"
              type="java.lang.String"
              column="name"
              length="50"
    />
     <one-to-one name="mySon" class="com.demo.hibernate.beans.Soncascade="all" property-ref="myFather"/><!--配置关联映射-->

</class> 

Son.hbm.xml

<class 
    name="com.demo.hibernate.beans.TSon" 
    table="t_son"
    lazy="false"
>

    <id
        name="id"
        type="java.lang.Integer"
        column="id"
    >
        <generator class="increment" />
    </id>

    <property
             name="name"
             type="java.lang.String"
             column="name"
             length="50"
    />
     <many-to-one name="myFather" class="com.demo.hibernate.beans.Father" unique="true"     <!--配置关联映射-->   
                         column="father_id" cascade="all"/>
   <!--father_id 为外键-->

</class>

插入一条记录
  Father father = new Father();
  father.setName("杨康");
  Son son = new Son();
  son.setName("杨过");
  
  father.setMySon(son);
  son.setMyFather(father);

  session.save(father);

 一对多关联

数据表为:母子表

Hibernate 关联 - 低调的华丽 - 辉色空间

POJO:

Hibernate 关联 - 低调的华丽 - 辉色空间

映射文件为:

Mother.hbm.xml

<class name="com.demo.hibernate.beans.Mother" table="t_mother" lazy="false">

       <id name="id" type="java.lang.Integer" column="id">

             <generator class="increment" />
       </id>

       <property name="name" type="java.lang.String" column="name" length="50" />

       <set name="myChildren" table="t_children" inverse="false" cascade="all" lazy="false">  <!--配置关联映射-->
                 <key column="mother_id"/>  <!--mother_id 为外键-->
                <one-to-many class="com.demo.hibernate.beans.Children" />
      </set>
 </class>

Children.hbm.xml

<class 
    name="com.demo.hibernate.beans.Children" 
    table="t_children"
    lazy="false"
>

    <id
        name="id"
        type="java.lang.Integer"
        column="id"
    >
        <generator class="increment" />
    </id>

    <property
             name="name"
             type="java.lang.String"
             column="name"
             length="50"
    />

    <!--如果是单向关联,下面的可以不用配置-->

    <many-to-one name="myMother"   <!--配置关联映射-->
             class="com.demo.hibernate.beans.Mother" cascade="all"
             column="mother_idinsert="true"/>   <!--mother_id 为外键-->
</class>

插入一条记录

  Mother mother = new TMother();
  mother.setName("阮母");
  Children child1 = new Children();
  child1.setName("阮小二");
  Children child2 = new Children();
  child2.setName("阮小五");
  Children child3 = new Children();
  child3.setName("阮小七");
  Set<Children> children = new HashSet<Children>();
  children.add(child1);
  children.add(child2);
  children.add(child3);

  session.save(mother);

 注:如果要查询“阮小二“的母亲是谁。则需要在Children.hbm.xml 文件中的<many-to-one>添加“insert = false” 和 “update = false”。t_children 中的外键mother_id不能有not null约束,否则,必须是双向关联,且必须有child1.setMother(mother),...child3.setMother(mother).。

多对多关联

数据表:

Hibernate 关联 - 低调的华丽 - 辉色空间
POJO:

Hibernate 关联 - 低调的华丽 - 辉色空间

 映射文件:

Student.hbm.xml

 <class 
        name="org.school.hibernate.beans.Student" 
        table="t_student"
        lazy="false"
>

        <id
                name="id"
                type="java.lang.Integer"
                column="id"
         >
                   <generator class="increment" />
         </id>

         <property
                   name="name"
                   type="java.lang.String"
                   column="name"
                   length="50"
         />
         <set  name="courses"  table=" t_student_course" lazy="false" inverse="false" cascade="save-update" > <!--配置关联映射-->
              <key column="student_id"/>
              <many-to-many class="org.school.hibernate.beans.Course" column="course_id" />
         </set> 
</class>

Course.hbm.xml

<class 
          name="org.school.hibernate.beans.Course" 
          table="t_course"
          lazy="false"
>

    <id
         name="id"
         type="java.lang.Integer"
         column="id"
    >
        <generator class="increment" />
    </id>

    <property
              name="name"
              type="java.lang.String"
              column="name"
              length="50"
    />

    <set  name="students"  table=" t_student_course" lazy="false" inverse="true" cascade="save-update" > <!--配置关联映射-->
              <key column="course_id"/>
              <many-to-many class="org.school.hibernate.beans.Student" column="student_id" />
    </set>

</class>

查询一条记录:查询“张三”学的课程

   Query query = session.createQuery("from Student where name=?");
   query.setString(0,"张三");
   Student student = (Student)query.uniqueResult();
   String stuName = student.getName();
   System.out.println(stuName);
   
   Set courses = student.getCourses();
   Iterator it = courses.iterator();
   while(it.hasNext()){
              String courseName = ((Course)it.next()).getName();
              System.out.println(courseName);
   }

 

在关联配置中的一些属性

invser:inverse = true 表示在给主表做save() 、update() 和 delete() 操作时,不会对象关联的表做同样的操作;inverse = false 表示当给主表中插入、修改 和 删除操作时,也会对相关联的表中做插入、修改和删除的操作。

cascade:【级联关系】  cascade = all 表示所有情况下均进行级联操;cascade = save-update 表示只有进行save() 和 update() 操作时,才进行级联操作;cascade = delete 表示只有进行 delete() 操作时,才进行级联操作。cascade = none 任何时候都不进行级联操作。cascade  = delete-orphan 表示删除和当前对象已解除关系的附属对象。

sort:【排序关系】 sort = unsorted(不排序);sort = natural(自然排序);sort = comparatorClass(由某个实现了java.util.comparator接口的类型指定排序算法)。

<key>子元素的column属性指定关联表的外键.。

lazy:【是否延迟加载】  lazy = false表示立即加载;lazy = true 掩饰加载。

fetch:【抓取数据方式】 fetch = select(默认) 表示【查询抓取(Select fetching)】:需要另外发送一条 SELECT 语句抓取当前对象的关联实体或集合;fetch = join 表示【连接抓取(Join fetching)】 : Hibernate通过 在SELECT语句使用OUTER JOIN(外连接)来获得对象的关联实例或者关联集合。

<many-to-one>元素的name属性声明外键关联对象的代号;class属性声明该外键关联对象的类;column属性声明该外键在数据表中对应的字段名,unique属性表示外键值必须唯一,不能重复,unique = true,多对一的关系实际上变成了一对一的关系。

分享到:
评论

相关推荐

    hibernate关联关系映射

    "hibernate关联关系映射"是Hibernate的核心概念之一,它定义了如何在Java对象和数据库表之间建立关系。以下是对这个主题的详细讲解: 一、一对一关系映射(One-to-One) 一对一关系是指一个实体对应另一个实体的...

    Hibernate关联关系映射目录

    ### Hibernate关联关系映射 #### 一、单向关联 单向关联指的是对象之间的关联关系只在一个方向上存在,也就是说这种关联关系仅在一个类中表示出来,在另一个类中不体现这种关联。 ##### 1. 一对一外键单向关联 ...

    hibernate实体关联关系映射

    Hibernate作为一种强大的对象关系映射(Object Relational Mapping,简称ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了持久化层的开发工作,而且提高了应用程序的灵活性与可维护性。其中,实体关联...

    hibernate关联映射的作用和常用属性解释

    其中,“关联映射”是Hibernate中的一个重要概念,用于处理实体之间的关联关系,例如一对一、一对多、多对一以及多对多等。 #### 常用属性解析 为了更好地理解和运用Hibernate中的关联映射机制,我们需要深入了解...

    hibernate对象关系映射实例

    3. **映射文件**:使用`hibernate-mapping`标签定义,或者使用Java注解,描述实体类与数据库表之间的映射规则。 4. **SessionFactory和Session接口**:SessionFactory是线程安全的,用于创建Session实例。Session是...

    Hibernate继承关系映射.pdf

    本文档主要聚焦于Hibernate框架下继承关系的映射,通过三种不同的策略——隐式继承映射、单表映射和关联表映射,来实现类的继承结构在数据库中的映射。 ### 隐式继承映射 #### 定义与配置 隐式继承映射也称为“表...

    hibernate的多种映射关系

    在 Hibernate 中,映射关系是将数据库表与 Java 类之间的关联方式,使得对象模型可以与关系模型无缝对接。本篇文章将详细探讨 Hibernate 中的多种映射关系。 1. **一对一映射 (One-to-One)** 一对一映射表示两个...

    对象-关系映射—Hibernate 培训 (中文)

    对象-关系映射—Hibernate 培训 (中文) 目录 一、持久化层-O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、持久化对象的状态和生命周期 五、Hibernate查询 六、Hibernate最佳...

    Hibernate关联关系配置

    ### Hibernate关联关系配置详解 #### 一、一对多与多对一关系配置 在软件开发过程中,实体之间的关联关系是常见的需求之一。其中,“一对多”与“多对一”的关系尤为常见,这类关系通常用来表示实体之间的层级或...

    Hibernate3.x关联映射示例

    关联映射是Hibernate中的核心概念之一,它允许我们将数据库中的表关系映射到对象之间的关系。主要的关联类型有以下几种: 1. **一对一(One-to-One)关联**:一个实体对应另一个实体的唯一实例。在数据库中,通常...

    hibernate array 数组映射

    Hibernate 是一个开源的Java ORM(Object-Relational Mapping)框架,它通过提供一种对象-关系映射机制,使得开发者可以使用面向对象的方式来操作数据库,从而避免了传统的JDBC繁琐的数据库操作。 ### 数组映射原理...

    Hibernate 多表映射关系配置

    对多关系在 Hibernate 中,多对多关系通常涉及到一个中间表来存储两个实体之间的关联。以下是如何配置 Hibernate 的多对多映射关系。 1. 数据库建表 假设我们有两张表,`users` 和 `roles`,它们通过 `user_roles` ...

    Hibernate关联映射-one to one单向外键关联

    本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...

    Hibernate一对一唯一外键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型在对象模型中的体现。这种关联通常用于表示两个实体之间非常特殊的联系,比如一个人只有一个身份证,或者一个公司只有一个总部...

    hibernate关系映射网址

    Hibernate是一种广泛使用的Java持久化框架,它简化了对象关系映射(Object-Relational Mapping,简称ORM)的过程,使得开发人员可以更加专注于业务逻辑的实现而无需过多关注底层数据库的具体操作细节。在Hibernate中...

    Hibernate教程19_关系映射案例二

    3. **关系映射(Relationship Mapping)**: - **一对一(OneToOne)**:通过`@OneToOne`注解设置一对一关系,可能涉及到`@PrimaryKeyJoinColumn`来指定关联的主键。 - **一对多(OneToMany)**:使用`@OneToMany`...

    hibernate映射关系讲解

    本文将深入讲解 Hibernate 中的映射关系,特别是如何实现一对一(One-to-One)的关联映射。 首先,Hibernate 的核心配置始于 `Configuration` 接口,它用于加载配置文件并创建 `SessionFactory`。`SessionFactory` ...

Global site tag (gtag.js) - Google Analytics