`
OracleX
  • 浏览: 124232 次
  • 性别: Icon_minigender_1
  • 来自: 地球
社区版块
存档分类
最新评论

HIBERNATE关联关系映射

阅读更多

1、单向N-1

2、单向1-1

3、单向1-N

4、单向N-N

5、双向1-N

6、双向N-N

7、双向1-1

下面就对这七种关联关系映射进行一个简单的总结:

一、单向的多对一

看两个POJO

public class Person{

private int pid;

private String name;

private Address address;

...//生成相应的getter、setter方法

}

----------------------------------------

public class Address{

private int id;

private String detail;

...//生成相应的getter、setter方法

}

这里我们需要维护的关系是多个Person可以对应同一个地址,使用单向的N-1映射我们只需要在多的一端加入一个外键指向一的一端即可

**看配置文件

<class name="Person">

<id name="id">

<generator class="native"/>

</id>

...//部分字段配置省略

<many-to-one name="address" column="addressId"/>//关键配置

</class>

这样配置以后hibernate就会帮我们在多的一端(Person)添加一个外键addressId指向一的一端

二、单向的1-1(外键关联)

可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性唯一

通过这种手段映射一对一唯一外键关联

配置文件只需要修改为:

<many-to-one name="address" column="addressId" unique="true"/>

三、单向的1-N

**看代码,我们知道一个班级有多名学生,这就是一个典型的1-N关系

public class Classes {
private int id;
private String name;
private Set students;

...//生成相应的getter、setter方法

}

---------------------------------------------------------------------------

public class Student {
private int id;
private String name;

..//生成相应是getter、setter方法

}

**映射原理:一对多关联映射,在多的一端添加一个外键指向一的一端,它维护的关系是一指向多

**配置文件:

<class name="Classes" table="t_classes">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="name"/>
   <set name="students">
    <key column="classesid"/>//在一的一端添加的外键指向多的一端(默认情况下市主键匹配)
    <one-to-many class="xxx.Student"/>//注意它维护的是一指向多的关系
   </set>
</class>

四、双向1-N

上面提到了单向的1-N在一的一端添加的外键指向多的一端即可,对于双向的1-N则类似于N-N,集合元素中不使用<one-to-many>

元素映射关联属性,而使用<many-to-many>元素,但是为了保证一的一端,因此需要增加unique="true"属性

**配置,简单修改单向1-N的配置文件

<class name="xxx.Classes" table="t_classes">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="name"/>
   <set name="students">
    <key column="classesid"/>

    <many-to-many class="xxx.Student" unique="true"/>
   </set>
</class>

五、单向多对多

**先看两个POJO

public class User {
private int id;
private String name;
private Set roles;

..//生成相应的getter、setter方法

}

---------------------------------------------------------------------------

public class Role {
private int id;
private String name;

..//生成相应的getter、setter方法

}

现在需要映射这样的N-N关系,一个User可以有多个Role,而一个Role有可以被多个User所拥有

这样我们就可以将一个N-N关系拆分为两个N-1的关系

**看配置文件

<class name="xxx.User" table="t_user">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="name"/>
   <set name="roles" table="t_user_role">
    <key column="userid"/>
    <many-to-many class="xxx.Role" column="roleid"/>
   </set>
</class>

这样我们的关系的明确了

   t_user               t_user_role                     t_role     

id name    < -------userid     roleid    ----- >      id     name

六、双向的多对多关系

双向的多对多映射需要在两边都增加集合元素,用于映射集合属性

修改上面的单向N-N映射

在Role中添加集合属性

public class Role {
private int id;
private String name;

privarte Set user

..//生成相应的getter、setter方法

}

修改配置文件

<class name="xxx.User" table="t_user">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="name"/>
   <set name="roles" table="t_user_role">
    <key column="userid"/>
    <many-to-many class="xxx.Role" column="roleid"/>
   </set>
</class>

------------------------------------------------------------------------------------------------

<class name="xxx.Role" table="t_role">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="name"/>
   <set name="users" table="t_user_role" order-by="userid">
    <key column="roleid"/>
    <many-to-many class="xxx.User" column="userid"/>
   </set>
</class>

注意点:1、双向多对多关联两边都需要指定连接表的表名和外键列的列名

           2、两个集合元素Set的table值必须指定,而且需要相同

七、双向的一对一关联

双向的1-1关联有两种形式:

1、基于外键的双向1-1关联

我们可以回想一下上面提到的单向1-1映射,它是有N-1的一个特例,只需要在<many-to-one>标签多的一端添加unique="true"属性就可以形成单向的1-1映射关系,那么该怎么样将这种映射改为双向的呢?

下面我们再举个例子:一个User必须要有一个唯一的identityId

首先创建两个POJO类

public class Person {

private int id;
private String name;
private IdentityId identityId;

..//生成相应的getter、setter方法

}

public class IdentityId {
private int id;
private String cardNo;
private Person person;

..//生成相应的getter、setter方法

}

**看配置文件

<class name="xxx.Person" table="t_person">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="name"/>
   <many-to-one name="identityId" class="xxx.IdentityId" unique="true"/>
</class>

-----------------------------------------------------------------------------------

<class name="xxx.IdentityId" table="t_identity">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="cardNo"/>
   <one-to-one name="person" class="xxx.Person" property-ref="identityId"/>
</class>

注意:这里的property-ref属性为identity表明建立了从identity对象到person对象的关联.

因此只要调用identity持久化对象的getIdentityId()方法就可以导航到Person对象 由此可见:

Person对象和IdentityId对象之间为双向的关联关系person.getIdentityId().getPerson()

2、基于主键的1-1双向关联

上面的POJO类不需要有任何变化,我们只需要修改配置文件

<class name="xxx.Person" table="t_person">
   <id name="id" column="ID">
    <generator class="foreign">
     <param name="property">identityId</param>
    </generator>
   </id>
   <property name="name"/>
   <one-to-one name="identity" clsss="xxx.IdentityId" constrained="true"/>
</class>

注意:这里的constrained="true"表明Person表的主键ID同时作为外键参考IdentityId表

--------------------------------------------------------------------------------------

<class name="xxx.Identity" table="t_identity">
   <id name="id">
    <generator class="native"/>
   </id>
   <property name="cardNo"/>
   <one-to-one name="person" class="xxx.Person"/>
</class>

注意:这里Person表中ID既是主键同时还作为外键参照表IdentityId,因为使用了foreign标识符生成策略Hibernate就保证了Person

对象与关联的IdentityId对象共享一个主键

综上所述,hibernate的实体映射方式很灵活,如果我们使用hibernate映射得当将可以大大简化持久层数据的访问!

分享到:
评论

相关推荐

    hibernate关联关系映射

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

    Hibernate 关联关系映射分类

    在深入探讨Hibernate关联关系映射分类之前,我们首先简要回顾一下Hibernate框架的基本概念。Hibernate是一种持久层框架,主要用于Java应用程序中的对象关系映射(ORM),它能够将面向对象的数据模型转换为数据库中的...

    Hibernate关联关系映射目录

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

    Hibernate关联关系映射.CHM

    Hibernate关联关系映射.CHM Hibernate文档相关

    Hibernate关联关系映射实例速查

    Hibernate关联关系映射实例速查,帮助初学者学习。

    Hibernate的关联关系映射图解

    Hibernate4中映射关系图解。

    hibernate关联关系映射PPT

    hibernate中的关联关系映射ppt!觉得有用的可以下!

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...

    hibernate的关联关系映射

    【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...

    Hibernate_关联关系映射配置详解

    Hibernate_关联关系映射配置详解,希望能帮助广大java爱好者

    hibernate实体关联关系映射

    ### Hibernate实体关联关系映射详解 #### 一、引言 Hibernate作为一种强大的对象关系映射(Object Relational Mapping,简称ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了持久化层的开发工作,...

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    Hibernate_关联关系映射配置

    本教程将详细讲解Hibernate中的关联关系映射配置,帮助你理解和掌握如何在Hibernate中设置不同类型的关联。 一、一对一(One-to-One)关联 在现实世界中,两个实体之间可能存在一对一的关系,例如一个人只有一个...

    Hibernate关联映射总结

    ### Hibernate关联映射总结 #### 一、基础知识 在探讨Hibernate中的关联映射之前,我们需要先理解几个基本概念,这将有助于我们更好地理解和应用这些关联映射。 - **主键**(Primary Key):主键是用来唯一标识一...

    Hibernate_实体关联关系映射--学习总结

    Hibernate的实体关联映射是其核心功能之一,它通过灵活的配置来适应不同场景下的数据持久化需求。通过对一对一、一对多、多对多等映射关系的熟练掌握和灵活运用,可以有效地处理复杂的实体关系,提高开发效率和应用...

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

    ### Hibernate关联映射的作用与常用属性详解 #### 关联映射概述 在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射...

    Hibernate注解 关联关系映射注解.docx

    在Java的持久化框架Hibernate中,注解是用于简化对象关系映射(ORM)的一种方式。本篇文章将详细探讨在Hibernate中如何使用注解来处理各种关联关系,特别是`mappedBy`属性的用法。 首先,`@OneToMany`注解用于表示...

Global site tag (gtag.js) - Google Analytics