`

在一对多关系中使用双向关联的好处

阅读更多
假设我们要实现一个简单的从Parent到Child的<one-to-many>关联。

如果在使用单向一对多关联,即只在Parent方配置关联。
<set name="children">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>

如果我们运行下面的代码
Parent p = .....;
Child c = new Child();
p.getChildren().add(c);
session.save(c);
session.flush();

Hibernate会产生两条SQL语句:

一条INSERT语句,为c创建一条记录

一条UPDATE语句,创建从p到c的连接

这样做不仅效率低,而且违反了列parent_id非空的限制。我们可以通过在集合类映射上指定not-null="true"来解决违反非空约束的问题:

这种现象的根本原因是从p到c的连接(外键parent_id)没有被当作Child对象状态的一部分,因而没有在INSERT语句中被创建。因此解决的办法就是把这个连接添加到Child的映射中。
在Child的配置文件中加入
<many-to-one name="parent" column="parent_id" not-null="true"/>

(我们还需要为类Child添加parent属性)
使之变为双向的一对多关系

现在实体Child在管理连接的状态,为了使collection不更新连接,我们使用inverse属性。
<set name="children" inverse="true">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>


下面的代码是用来添加一个新的Child
Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();

现在,只会有一条INSERT语句被执行!
分享到:
评论

相关推荐

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

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

    JPA_2_一对多双向关联关系

    在这个场景中,我们将深入探讨如何在JPA 2中实现一对多双向关联关系。 首先,我们需要定义两个实体,一个是"一"的一端,另一个是"多"的一端。假设我们有`Department`(部门)和`Employee`(员工)两个实体。在`...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    mybatis系列三:一对多双向关联

    总之,MyBatis的一对多双向关联提供了丰富的数据模型映射能力,使得在Java对象和数据库表之间建立复杂关系变得更加容易。通过合理配置映射文件和Java实体,以及充分利用MyBatis提供的工具,可以高效地管理这些关联...

    多对一双向关联关系实现源码

    总结,多对一双向关联关系在Hibernate中的实现涉及实体类的注解配置、级联操作的管理以及在业务逻辑中维护关联的正确性。理解和熟练掌握这种关联关系对于开发高效、稳定的企业级应用至关重要。通过分析`hibernateM2O...

    JPA中的一对多双向关联与级联操作

    这篇博客将深入探讨JPA中的一对多双向关联以及级联操作。 首先,让我们理解一对多关联。假设我们有两个实体,一个是`User`(用户)和一个是`Post`(帖子)。一个用户可以发布多个帖子,但一个帖子只能属于一个用户...

    13_jpa多对多双向关联实体定义与注解

    4. **注解细节**:`@JoinColumn`用于单向一对一或一对多关系,而在多对多关系中,通常使用`@JoinTable`来指定中间表的信息,包括表名、连接列等。 5. **操作关联**:在JPA中,可以通过添加或移除对象到集合属性来...

    Hibernate一对一主键关联映射(双向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系数据库模型映射方式。这种关联通常发生在两个实体之间,且每个实体都只有一个对应的实例。本篇文章将详细探讨双向一对一主键关联映射...

    多对多双向关联

    首先,我们来看如何在Java中使用JPA(Java Persistence API)或Hibernate(一个流行的JPA实现)来设置多对多双向关联。双向关联意味着两个实体类都将持有对彼此的引用。例如,考虑一个“学生”和“课程”的场景,每...

    SSH一对多(两表双向关联查询)

    SSH一对多(两表双向关联查询)是一种在Java Web开发中常见的数据操作方式,主要涉及到Spring、Struts和Hibernate这三大框架的集成使用。在这个场景下,我们将关注于如何通过Hibernate来实现数据库中的两个表——...

    Hibernate一对多双向自身关联demo代码

    在这个“Hibernate一对多双向自身关联demo代码”中,我们将深入理解如何实现一个实体类与其自身进行一对多的双向关联。这种关联在实际应用中常见于例如用户的朋友关系、员工的上下级关系等场景。 首先,让我们了解...

    hibernate外键实现一对一双向关联关系源码

    在Hibernate中,通常使用`@OneToOne`注解来定义一对一关系,而双向关联则意味着两个实体类都将拥有指向对方的引用。 1. **实体类定义**: 在一对一双向关联中,我们会有两个实体类,例如`User`和`Profile`。`User`...

    hibernate一对多关联映射(双向关联)

    总之,理解并正确实现Hibernate中的一对多双向关联映射是提升应用程序性能和数据一致性的重要步骤。通过细心配置映射文件,编写相应的实体类,以及妥善处理关联关系的维护,我们可以有效地管理复杂的数据结构。

    hibernate多对多双向关联

    总结来说,理解并能正确使用Hibernate中的多对多双向关联是Java开发中的重要技能,涉及到实体设计、映射配置、数据操作和性能优化等多个方面。通过学习提供的博客和相关代码示例,开发者可以深入掌握这一主题,并将...

    Hibernate ORM - 一对多双向连接表关联关系

    虽然描述部分为空,但根据标题,我们可以推断这篇文章可能详细介绍了如何在Hibernate中设置和管理一对多双向关联,包括配置XML映射文件、注解或者使用Java配置,以及如何在代码中处理这种关联关系。 **标签解析:**...

    hibernate双向一对多关联映射(注解版)

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

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

    **描述:** 由于描述为空,我们无法从描述中获取具体的信息,但通常在一对多双向关联中,我们会关注如何在Hibernate配置文件或注解中设置这种关系,以及如何在Java代码中进行操作,如保存、更新和查询等。...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

    多对一双向关联(视频)

    通过学习和掌握多对一和一对多双向关联,开发者可以更好地设计和实现复杂的数据库模型,并有效地使用ORM工具将这些模型映射到实际的数据库操作中。理解这些关联的概念对于开发高效、可维护的Java应用至关重要。

Global site tag (gtag.js) - Google Analytics