Hibernate的关联映射

 

 Hibernate可以以面向对象的方式进行数据库访问,既然是面向对象,我们知道在客观世界中,对象不会孤立的存在,在Hibernate中,Hibernate把这种对象与对象之间的联系称为关联关系,如果在我们设计实体类的时候,可以良好的映射这些关联关系,便可以大大简化持久层数据的访问

  关联关系分为两类:

    单向关系:假如学生,老师这个例子,单向关系就是指只能从老师可以访问学生,或者只能从学生访问老师

   双向关系:还是上面的例子,双向关系是指 既能从老师访问学生,又能从学生访问老师

 单向关系中具体的还有:                   双向关系中具体的有:

    1 -> 1               1 <-> 1

    1 -> N                1 <-> N

    N -> N              N <-> N

    N -> 1



(一) 【单向】N -> 1

  常见的多对一关系,是父子关系。父类不能访问子类,而其子类s都可以访问父类,在生活中,例子就是:我所住的这一栋楼对应着一个大庆路XX号地址。我们可以从这栋楼中任意一个用户来寻找到这个具体地址,而告诉你一个地址,你却不知道有哪用户。

  Hibernate为了支持这种关系映射,程序应该N持久化类一端增加一个属性,该属性引用1持久类一段。

  • 无连接表的 N -> 1关联

配置关联关系的两种方式:

1。使用注解(未完成)

  对于N -> 1关联,不论是单向关联,还是多向关联,都需要在N的一端使用@ManyToOne修饰代表关联实体的属性

  具体的以后补充..

2。使用*.hbm.xml(重点)

  N的一端的配置文件

    <class name="domain.Person" table="PERSON">
        <id name="id">
            <column name="ID"></column>
            <generator class="increment"></generator>
        </id>
        <property name="name">
            <column name="NAME"></column>
        </property>
        <many-to-one name="address" column="ADDRESS_ID" class="domain.Address" cascade="save-update"></many-to-one>
    </class>

  • 有连接表的N -> 1关联

配置关联关系的方式:

1。使用注解

(二) 【单向】1 -> 1关联

  • 无连接表的关联

  同单向N -> 1相似,一方可以直接访问另一端

配置关联关系的两种方式:

1。使用*.hbm.xml(重点)

  • 有连接表的关联

配置关联关系的方式:

1。使用注解

(三) 【单向】1 -> N关联

  单向1 -> N关联,1的持久化类里需要集合属性

public class Person implements Serializable{
    private Integer id;
    private String name;
    private Set<Address> addresses;
       .....
}

---1 -> N(从一个人身上可以知道了他多个住址,而只找到住址,住址不会告诉你这是谁住的)----

public class Address implements Serializable {
    private Integer id;
    private String place;
        ...
}
  • 无连接表的关联(外键表示关联关系)

配置关联关系的两种方式:

1。使用*.hbm.xml(重点)

  (1)*.hbm.xml中核心配置

        <set name="addresses" cascade="save-update"  >
            <!-- 外键字段名 -->
            <key column="personId"></key>
            <one-to-many class="domain.Address" />
        </set>

  (2)创建了外键来维护关联关系

从数据库查看Address表的结构:

2。使用注解

  • 有连接表的关联(第三方表维护关联关系)

配置关联关系的方式:

1。使用*.hbm.xml(重点)

  (1)*.hbm.xml中核心配置

        <set name="addresses" cascade="save-update" table="person_address" >
            <!-- 外键表主键为这两个外键id列的组合 -->
            <key column="personId"></key>
            <!-- unique的目的为防止多对一的出现,确保是单向的一对多 -->
            <many-to-many class="domain.Address" column="adresssId" unique="true" />
        </set>

  (2)创建了第三方表的方式维护关联关系  

在数据库查看第三方表person_address:

2。使用注解

(四) 【双向】1 <-> N关联

  单向1 <-> N关联,1的持久化类里需要集合属性,N的持久化类需要一个1的引用变量

  • 无连接表的关联

配置关联关系的两种方式:

1。使用*.hbm.xml(重点)

  (1.1)对于1的一端*.hbm.xml采用的配置文件

        <!-- 一对多,使用集合 -->
        <set name="addresses" cascade="save-update">
            <key column="personId"></key>
            <one-to-many class="domain.Address"/>
        </set>

  (1.2)对于N的一端*.hbm.xml采用的配置文件

        <many-to-one name="person" class="domain.Person" column="personId" cascade="save-update"></many-to-one>

  (2) 查看两张表的数据库中的结构

  

  

2。适用注解

  • 有连接表的关联

配置关联关系的方式:

1。使用*.hbm.xml(重点)

  (1.1)对于1的一端*.hbm.xml采用的配置文件

        <set name="addresses" cascade="save-update" table="person_address">
            <key column="personId"></key>
            <many-to-many class="domain.Address" column="addressId"/>
        </set>

  (1.2)对于N的一端*.hbm.xml采用的配置文件

        <!-- join元素强制使用连接表 -->
        <join table="person_address">
            <key column="addressId"></key>
            <many-to-one name="person" class="domain.Person" column="personId" cascade="save-update"></many-to-one>
        </join>

  (2) 查看两张表的数据库中的结构

  

2。使用注解

时间: 2024-10-10 00:47:32

Hibernate的关联映射的相关文章

Hibernate注解----关联映射注解以及课程总结详解----图片版本

上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3-1 本章简介 3-2 实体之间的关系 3-3 一对一单向外键关联(一) 3-4 一对一单向外键关联(二) 3-5 一对一双向外键关联 3-6 一对一单向外键联合主键 3-7 多对一单向外键关联(一) 3-8 多对一单向外键关联(二) 3-9 一对多单向外键关联 3-9 一对多双向外键关联 3-10

006——hibernate一对一关联映射

一对一关联映射有两种方式:主键关联和外键关联 以夫妻为例(Husband----Wife) 单向关联实体类: Husband.java package com.java.hibernate; public class Husband { private int id; private String name; private Wife wife; public Wife getWife() { return wife; } public void setWife(Wife wife) { thi

9、Hibernate之关联映射(hibernate映射)

回顾Hibernate: 1. hibernate开发环境搭建 --> 引入jar: hibernate.jar + required + jpa + 驱动包 -> hibernate.cfg.xml -> javabean/*.hbm.xml -> Application 测试 2.hibernate api --> Configuration --> SessionFactory --> Session -> Transaction --->Que

Hibernate的关联映射之1-1关联映射

二.1-1 无论是单向1-1映射关联,还是双休1-1映射关联,都有三种映射策略:基于主键.基于外键.采用连接表. 1.单向1-1映射关联 1.1.基于主键的单向1-1映射关联 对于基于主键的单向1-1关联,基于主键关联的持久化类不能拥有自己的主键生成器策略,它的主键由关联实体来负责生成. 是根据他自己的person属性来获得的.即他通过自身的一个getPerson()方法来获得Person对象.然后通过Person对象中的getID()方法获得id,然后赋值给自身id.这样就可以不需要自己来生成

Hibernate的关联映射之1-N关联映射

三.1-N 对于1-N而言,它的持久化类发生了一点改变,持久化类里需要使用集合属性.因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现. 1.单向1-N关联 对于单向的1-N关联关系,只需要在1的一端增加Set类型的属性,该属性记录当前实体的关联实体. 同样以员工-部门为例(Employee-->Department).两个持久化类如下: Department [java] view plain copy print? public class Department { priv

hibernate 之 关联映射的基于外键的双向一对一关联

1. 人和身份证是一个一对一的关系,他们的表结构为: 2. 类结构:Person.java public class Person { private int id; private String name; private int age; private IdCard idCard; public Person() { } public Person(String name, int age) { super(); this.name = name; this.age = age; } pu

hibernate 之 关联映射的双向一对多关联

1. 考虑学生表 和 教师表,表结构和单向的表结构一样. 2. 类结构:Teacher.java public class Teacher { private int id; private String name; private Set<Student> students = new HashSet<Student>(); public Teacher() { } public Teacher(String name) { super(); this.name = name;

hibernate 之 关联映射的基于外键的单向一对一映射

1. 人和身份证是一个一对一的关系,他们的表结构为: 2. 类结构:IdCard.java : public class IdCard { private String id; private String address; public IdCard() { } public IdCard(String id, String address) { super(); this.id = id; this.address = address; } public String getId() { r

hibernate+mysql关联映射师遇到java.lang.StackOverflowError异常

原因在进行关联映射时在多的一方的toString方法中有对属性对应的一的一方的输出 比如: 一的一方: @Entity@Table(name = "app",schema = "", catalog = "game")public class AppEntity { @Id @Column(name = "appId") private String appId; @Basic @Column(name = "app

hibernate之关联映射

No.1 映射一对多双向关联关系: 当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象. 步骤一: 注意:hibernate要求在持久化类中定义集合类属性时,必须把属性类型设置为接口类型(如:java.util.Set) 优点:声明接口类型可以提高持久化类型的透明性,当hibernate调用setEmp()时,传递的参数是hibernate自定义的该接口的类的实例, 如果把setEmp()设置成java.util.HashSet,就强迫hibernate只能把Has