>在双向多对多关系中设置MappedBy的原因是什么?
>当一个表有大量记录时,而其他表有少量,哪一方更好地放置mappedBy?

解决方法

这实际上是一个很好的问题,它有助于理解“拥有”实体的概念.如果你想防止双方(双向关系)有连接表,一个好主意,那么你需要在一侧有一个mappedBy =元素.

是否存在连接表由@ManyToMany注释的mappedBy =“name”元素控制. Javadoc for mappedBy for the ManyToMany annotation says:

The field that owns the relationship. required unless the relationship is unidirectional.

对于(双向)示例,如果只有两个@ManyToMany注释而没有mappedBy =元素,则默认将具有两个实体表和两个连接表:

Hibernate: create table SideA (id bigint not null,primary key (id))
Hibernate: create table SideA_SideB (sidea_id bigint not null,sidebs_id bigint not null,primary key (sidea_id,sidebs_id))
Hibernate: create table SideB (id bigint not null,primary key (id))
Hibernate: create table SideB_SideA (sideb_id bigint not null,sideas_id bigint not null,primary key (sideb_id,sideas_id))

虽然这说明每个实体“拥有”其ManyToMany关系,但额外的连接表在典型的用例中是多余的,而Javadoc说你需要一个mappedBy注释.如果我决定让SideA“拥有”该关系,那么我将mappedBy =元素添加到SideB实体以指定它不拥有该关系:

@Entity
public class SideA {
    @ManyToMany
    Set<SideB> sidebs;
}
@Entity
public class SideB {
    @ManyToMany(mappedBy="sidebs")
    Set<SideA> sideas;
}

由于SideB实体不再拥有其ManyToMany关系,因此不会创建额外的JoinTable:

Hibernate: create table SideA (id bigint not null,primary key (id))
Hibernate: create table SideB (id bigint not null,primary key (id))
Hibernate: create table SideA_SideB (sideas_id bigint not null,primary key (sideas_id,sidebs_id))

这对开发人员来说很重要,因为他或她必须明白,除非将关系添加到拥有实体(在本例中为SideA实体),否则不会保持任何关系.

因此,如果您具有双向ManyToMany关系,这意味着您在所涉及的两个实体上都有ManyToMany,那么您应该根据Javadoc在其中一个上添加mappedBy =“name”并避免使用冗余连接表.

至于创建拥有实体的哪一方,没有正确的答案,这取决于您的系统认为最好的.这些关系只会在条目被置于拥有方时保持不变,因此您必须问自己是否更常更改SideA的列表或SideB的列表.如果SideA拥有该关系,那么您可以通过在SideA实例中添加或删除SideB实例来更新关系,但如果您有一个SideB实例,您希望保留SideB实例,则需要遍历列表并更改每个实例. SideA在列表中.

与往常一样,启用sql日志并查看数据库中发生的情况始终是个好主意:

编辑:如果你有一个只创建一个没有mappedBy设置的连接表的持久性提供程序,那么你必须检查文档以查看哪一方“拥有”该关系.可能是双方都不拥有它,并且任何一方或任何一方都不会更新该实体.

参考文献:

What is the difference between Unidirectional and Bidirectional associations?.

What does relationship owner means in bidirectional relationship?.

What is the “owning side” in an ORM mapping?.

Most efficient way to prevent an infinite recursion in toString()?.

jpa – 双向@ManyToMany中的MappedBy:原因是什么的更多相关文章

  1. Spring Data JPA系列JpaSpecificationExecutor用法详解

    这篇文章主要为大家介绍了Spring Data JPA系列JpaSpecificationExecutor用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  2. Spring Boot 整合持久层之Spring Data JPA

    在介绍Spring Data JPA的时候,我们首先认识下Hibernate。Hibernate是数据访问解决技术的绝对霸主,使用O/R映射技术实现数据访问,O/R映射即将领域模型类和数据库的表进行映射,通过程序操作对象而实现表数据操作的能力,让数据访问操作无须关注数据库相关的技术

  3. 使用JPA插入枚举类型字段

    这篇文章主要介绍了使用JPA插入枚举类型字段,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  4. 使用JPA单项一对多外键关联

    这篇文章主要介绍了使用JPA单项一对多外键关联,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  5. 使用spring jpa 如何给外键赋值

    这篇文章主要介绍了使用spring jpa 如何给外键赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  6. Spring JPA 增加字段执行异常问题及解决

    这篇文章主要介绍了Spring JPA 增加字段执行异常问题及解决,具有很好的参考价值,

  7. Spring Data JPA踩坑记录(@id @GeneratedValue)

    这篇文章主要介绍了Spring Data JPA踩坑记录(@id @GeneratedValue),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  8. Spring Boot深入学习数据访问之Spring Data JPA与Hibernate的应用

    Spring Data JPA是Spring Data的子项目,在使用Spring Data JPA之前,先了解一下Hibernate,因为Spring Data JPA是由Hibernate默认实现的

  9. 使用JPA双向多对多关联关系@ManyToMany

    这篇文章主要介绍了使用JPA双向多对多关联关系@ManyToMany,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  10. SpringBoot利用jpa连接MySQL数据库的方法

    这篇文章主要介绍了SpringBoot利用jpa连接MySQL数据库的方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部