`

Hibernate的关系配置:一对多

阅读更多

一对多的关系在我们的日常生活中并不少见, 比如说, 一个用户可以有多个手机.

 

public class User implements java.io.Serializable  {
    
      private Set equipments = new HashSet(0);

      
	public Set getEquipments() {
		return this.equipments;
	}

	public void setEquipments(Set equipments) {
		this.equipments = equipments;
	}


}

 

 

public class Equipment implements java.io.Serializable {

private User user;

public User getUser() {
		return this.user;
	}

	public void setUser(User user) {
		this.user = user;
	}


}

 

 

上面的两个类中我们可以看到, 一个User有多个equipment, 而每个equipment只能被一个User所拥有.

 

所以在User.hbm.xml中这样配置

 

<class name="com.*.cd.pojo.User" table="users" schema="public" dynamic-insert="true" dynamic-update="true">
   <id name="userId" type="java.lang.Integer">
           <column name="user_id" />
            <generator class="sequence">
                  <param name="sequence">seq_cd_user_id</param>
            </generator>
    </id>

<set name="equipments" inverse="true" lazy="true" >
    <key>
          <column name="user_id" />
     </key>
     <one-to-many class="com.*.cd.pojo.Equipment" />
</set>
</class>

 

我们知道, 在一对多关系中, 多方都有一个附带的属性, 就是一方的主键作为外键. 所以在User.hbm.xml中,的Set里面要有一个<key></key>属性. 作为作为equipment的外键.

 

inverse . 默认为false. 在这里指定是由谁来维护这个主外键关系的.  在这里inverse="true" 表示该实体是对立面, 不具备维护user_id的权限. 修改此集合不会影响到关联表.

 

lazy: 加载User的时候是否及时加载equipments. 默认为false. 这里lazy="true" , 加载User的时候并不会立即加载其儿子.

 

<one-to-many class="com.*.cd.pojo.Equipment" />指定了多方是Equipment.

 

下面我们来看看多方是怎么配置的.

 

<class name="....*.Equipment" table="equipments" schema="public"
dynamic-insert="true" dynamic-update="true">
   <id name="eacId" type="java.lang.Integer">
       <column name="eac_id" />
    <generator class="foreign" >
          <param name="property">EACard</param>
     </generator>
   </id>

   <many-to-one name="user" class="....*.User" fetch="select" >
        <column name="user_id" />
   </many-to-one>
</class>

  

在这里简单说明一下. name="....*.Equipment" 是对应的全限类名, table="equipments" 是对应的表名, schema="public" 根据数据库不同而不同.

而dynamic-insert和dynamic-update会根据实际情况生成动态的inser和update语句.

dynamic-insert="true" 的时候,他会将属性不为null的属性拼接成sql语句插入,

dynamic-update="true"的时候,会只更新哪些改变过的字段.

 

这里, equipment是多方, user是一方, 所以用到<many-to-one>

name="user" 是equipment中的一个属性 , class="...*.User" 会根据User类实例化一个user对象.

fetch="select" 指定了关联对象的加载方式是select . 默认为join.

当fetch = "select"时, 首先会加载此equipment对象, 然后根据此equipment的外键userId加载User对象, 会形成n+1此查询, 而fetch = "join"时, 会根据外键关联一次性加载equipment和User对象.

当lazy="true"时, 就不会加载关联对象.

 

一对多的关键点.

在一方配置<set></set>属性中用inverse="true"和false来设置自己是否有权限维护主外键关系. 默认是false由自己维护, 当为true时. 将此权限交由多方维护.

 set中的<key><column name="user_id" /> </key>指定此主键为对方的外键.

<one-to-many class=".....*.Equipment" /> 说明多方的实例对象由Equipment生成.

 

在多方的配置就只是一个

<many-to-one name="user" class="User" fetch="select">

   <column name="user_id" /><!--外键-->

</many-to-one>

 

 

 

在多对多关系中, 例如角色和用户的关系, 一个用户可以是多个角色, 而每个角色可以指派给多个用户. 在这种情况下我们会将多对多化解为两个一对多处理.

 

分享到:
评论

相关推荐

    Hibernate映射关系配置:XML方式和注解方式

    标题“Hibernate映射关系配置:XML方式和注解方式”涉及到的是Java持久层框架Hibernate中的一个重要概念——对象关系映射(ORM)。在这个主题中,我们将探讨如何通过XML映射文件和注解来配置Hibernate实体之间的关系...

    Hibernate part 8:一对多关联关系映射

    在实际应用中,理解和正确配置一对多关联关系映射对于优化数据库交互至关重要。同时,注意避免N+1查询问题,即在获取父实体时因懒加载引发的大量额外查询,可以通过预加载(eager fetching)或使用JOIN查询来解决。 ...

    hibernate一对多、多对一、一对一、多对多配置实例

    本文将深入探讨Hibernate中的一对多、多对一、一对一以及多对多四种关系映射的配置实例,帮助开发者更好地理解和运用这些关系。 ### 一对多关系(One-to-Many) 在数据库设计中,一对多关系是最常见的一种关联,...

    hibernate一对多项目

    1. **配置一对多关系**: - 在实体类中,我们需要定义一个集合类型的属性,比如`List&lt;Order&gt;`,表示一个用户可以有多个订单,使用`@OneToMany`注解标记这个属性。该注解接受一个`mappedBy`参数,指定多的一方在关联...

    Hibernate ORM - 一对多双向关联关系

    标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...

    hibernate知识复习三:关联映射:一对多/多对一

    本文将深入探讨Hibernate中的关联映射,特别是“一对多”和“多对一”的关系映射,这对于理解如何在Java应用程序中处理复杂的数据库交互至关重要。 一、Hibernate简介 Hibernate是Java平台上的一个开源ORM框架,它...

    hibernate之一对多配置demo

    1. XML配置一对多关系: 在Hibernate的映射文件中,我们需要为两个实体(类)分别创建映射文件,一方(如班级)的映射文件中会包含多方(如学生)的集合。在多方的类中,通常有一个集合属性来保存所有关联的一方...

    Hibernate双向一对多经典实例

    3. **双向一对多**:在Hibernate中,双向一对多关系意味着双方都可以导航到对方。班级实体可以访问其所有学生,而每个学生实体也知道它所属的班级。 4. **配置映射文件**:使用Hibernate,我们需要为每个实体创建一...

    Hibernate的配置详解

    在本篇中,我们将深入探讨Hibernate的配置,特别是涉及一对一、一对多和多对多关系的配置。 首先,配置过程始于`Configuration`接口。这个接口用于设置Hibernate所需的配置信息,如数据源、连接参数等,并根据配置...

    hibernate实例(一对多,多对一)

    在Hibernate中,配置一对一和一对多关联通常涉及以下步骤: 1. 定义实体类:为每个数据库表创建对应的Java类,并添加属性以表示字段。 2. 映射实体:使用XML映射文件或注解来定义实体间的关联关系。 3. 主配置文件...

    hibernate:一对多,多对多,一对一,乐观锁,二级缓存

    多对多关系常见于两个实体之间没有固定一对一或一对多关系的情况,如学生和课程。使用`@ManyToMany`注解,需要创建一个中间表(通常是联合主键)来存储两个实体的关联。`@JoinTable`注解用来定义中间表的详细信息。...

    Hibernate关联关系配置

    #### 一、一对多与多对一关系配置 在软件开发过程中,实体之间的关联关系是常见的需求之一。其中,“一对多”与“多对一”的关系尤为常见,这类关系通常用来表示实体之间的层级或分类结构。以消费者与订单为例进行...

    Hibernate annotation JPA 一对多,多对多

    在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...

    Hibernate的多对一和一对多操作实例

    总之,Hibernate的多对一和一对多操作不仅提供了灵活的关联管理,还允许开发者将复杂的数据关系逻辑封装在应用程序中,从而简化数据库设计,提高代码的可读性和可维护性。然而,这也要求开发者对Hibernate的映射机制...

    hibernate一对多案例

    在`Student.hbm.xml`中,我们会在`&lt;set&gt;`标签中配置一对多关系: ```xml ``` 这里的`inverse="true"`表示子类`Course`负责维护关系,`cascade="all"`意味着对`Student`的操作(如保存、更新、删除)将影响到...

    hibernate多对一单向关联关系实现源码

    在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...

    hibernate一对多代码

    在Java的持久化框架Hibernate中,"一对多"映射是一种常见的关系模型,它反映了数据库中表之间的关联。本文将详细解析"hibernate一对多映射"的概念、配置及其实现过程,以帮助理解并掌握这一核心特性。 首先,我们要...

    hibernate配置文件详解

    * `set`:定义一对多关联关系 这些配置项是 Hibernate 建立对象关系映射所需的基本信息。 Hibernate 配置文件是其核心组件之一,用于定义 Hibernate 的运行期参数。通过 hibernate.cfg.xml 和 .hbm.xml 文件,我们...

    hibernate一对多实例

    5. **懒加载和级联操作**:在配置一对多关系时,我们还可以选择是否启用懒加载(默认情况下,集合是懒加载的),以及是否开启级联操作,如级联保存、更新或删除。 6. **性能优化**:为了提高性能,可以考虑使用`...

    hibernate基于主外键的一对多/多对一关联

    总结起来,Hibernate中的一对多/多对一关联是通过主外键映射来实现的,通过注解和配置文件定义实体间的关联关系,利用懒加载或立即加载策略控制数据获取,同时要注意双向关联的维护和级联操作的设置,以确保数据的...

Global site tag (gtag.js) - Google Analytics