对Jpa中Entity关系映射中mappedBy的全面理解

 更新时间:2021年12月06日 09:53:17   作者:ido  
这篇文章主要介绍了对Jpa中Entity关系映射中mappedBy的全面理解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

对Jpa Entity关系映射中mappedBy的理解

mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段数据库中1对多的关系,关联关系总是被多方维护的即外键建在多方,我们在单方对象的@OneToMany(mappedby="")把关系的维护交给多方对象的属性去维护关系。

对于mappedBy复习下

a) 只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性;

b) mappedBy标签一定是定义在the owned side(被拥有方的),他指向theowning side(拥有方);

c) 关系的拥有方负责关系的维护,在拥有方建立外键。所以用到@JoinColumn

d)mappedBy跟JoinColumn/JoinTable总是处于互斥的一方

这里的维护关联关系,拿多对多来说就是中间表,在不设置cascade的情况下,中间表由负责维护关联关系的一方维护

举例说明

Game 和User 两个实体类,他们是多对多的关系,有中间表t_game-user.

在User中配置有:

@ManyToMany(mappedBy="users")
public List<Game> getGames() {
    return games;
}

Game中配置有:

@ManyToMany
@JoinTable(name = "t_game_user",
    joinColumns = {@JoinColumn(name = "game_id",referencedColumnName="gameId")},
    inverseJoinColumns = {@JoinColumn(name = "user_id",referencedColumnName="id")})
public List<User> getUsers() {
  return users;
}

所以说由Game来维护他们的关联关系,即中间表。表现形式:

1.因为没有配置cascade所以分别给Game,User添加4条数据,然后手动在中间表中添加他们的关联关系

2.在程序中执行删除User

Hibernate: delete from t_user where id=?
Hibernate: delete from t_user where id=?
Hibernate: delete from t_user where id=?
Hibernate: delete from t_user where id=?

删除了User,并没有对中间表发生影响

在程序中执行删除Game

Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game_user where game_id=?
Hibernate:delete from t_game where game_id=?
Hibernate:delete from t_game where game_id=?
Hibernate:delete from t_game where game_id=?
Hibernate:delete from t_game where game_id=?

对中间表产生了影响,说明是Game在维护他们之间的关联关系

Spring-jpa中mappedBy的作用

mappedBy主要用于需要外键(存在于@OneToOne,@OneToMany,@ManyToMany中)的场景下,帮助我们进行外键管理。

使用@JoinColumn存在的问题

在“一对多”的场景下,如果不使用mappedby,则一般是在“一方”和“多方”分别使用@joinColumn注解,帮助我们在“多方”和“一方”进行外键的维护,这样做的好处去掉多出来的一张关系映射表。

但是这会产生一个问题,就是执行的时候因为两方都要维护外键,所以在进行数据的增删时会执行冗余的update语句(update”多方“的外键),这些update语句是没有必要的。

因此,问题的解决就是需要我们只在“多方”来维护外键,为什么不在“一方'维护外键,因为这样”一方“为了维护外键还是会执行多余的update语句。

使用mappedBy

所以,我们需要在@OneToMany上使用mappedBy,值一般设为“多方”Entity类的外键数据成员名(注意不是数据库上的字段名,同时必须去掉@JoinColumn,不然会产生冲突)。这样就将外键的维护权交给“多方”,多方还是要使用@JoinColumn,并将值设为外键字段名,不然系统会自动帮我们设置一个外键字段。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot+Thymeleaf实现生成PDF文档

    SpringBoot+Thymeleaf实现生成PDF文档

    Thymeleaf是一个现代的服务器端 Java 模板引擎,适用于 Web 和独立环境。Thymeleaf 的主要目标是为您的开发工作流程带来优雅的自然模板,本文就来用它实现生成PDF,感兴趣的可以了解一下
    2022-09-09
  • 时间处理函数工具分享(时间戳计算)

    时间处理函数工具分享(时间戳计算)

    这篇文章主要介绍了时间处理函数工具,包括得到时间戳、周一、周末、时间更改、时间精确计算等功能
    2014-01-01
  • java多线程编程之线程的生命周期

    java多线程编程之线程的生命周期

    线程要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。下面给出了Thread类中和这四种状态相关的方法
    2014-01-01
  • java实现从方法返回多个值功能示例

    java实现从方法返回多个值功能示例

    这篇文章主要介绍了java实现从方法返回多个值功能,结合实例形式分析了集合类、封装对象、引用传递三种实现方法,需要的朋友可以参考下
    2017-10-10
  • Java使用itext5实现PDF表格文档导出

    Java使用itext5实现PDF表格文档导出

    这篇文章主要介绍了Java使用itext5实现PDF表格文档导出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • springboot通用分支处理超级管理员权限逻辑

    springboot通用分支处理超级管理员权限逻辑

    这篇文章主要为大家介绍了springboot通用分支处理超级管理员的权限逻辑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • java 基础教程之多线程详解及简单实例

    java 基础教程之多线程详解及简单实例

    这篇文章主要介绍了java 基础教程之多线程详解及简单实例的相关资料,线程的基本属性、如何创建线程、线程的状态切换以及线程通信,需要的朋友可以参考下
    2017-03-03
  • java实现简单扫雷小游戏

    java实现简单扫雷小游戏

    这篇文章主要为大家详细介绍了java实现简单扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 一文掌握Java的工具类和API

    一文掌握Java的工具类和API

    在Java中,工具类通常包含一系列静态方法,用于执行常见的任务,这些任务可能不直接关联到特定的业务逻辑,而是用于处理一些基础的数据转换、字符串操作、文件操作等,这篇文章主要介绍了一文搞懂Java的工具类和API,需要的朋友可以参考下
    2008-01-01
  • SpringBoot spring.factories加载时机分析

    SpringBoot spring.factories加载时机分析

    这篇文章主要为大家介绍了SpringBoot spring.factories加载时机分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论