对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,并将值设为外键字段名,不然系统会自动帮我们设置一个外键字段。

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

相关文章

  • mybatis-plus(insertBatchSomeColumn批量添加方式)

    mybatis-plus(insertBatchSomeColumn批量添加方式)

    这篇文章主要介绍了mybatis-plus(insertBatchSomeColumn批量添加方式),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java源码角度分析HashMap用法

    Java源码角度分析HashMap用法

    这篇文章主要介绍了Java源码角度分析HashMap用法,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java实现优酷视频地址解析示例代码分享

    java实现优酷视频地址解析示例代码分享

    最近做了一个在线视频的下载器,需要解析youku的视频,获得真正的视频地址,现在把解析过程记录下来以供参考
    2014-01-01
  • Spring Boot实战之模板引擎

    Spring Boot实战之模板引擎

    这篇文章主要介绍了Spring Boot实战之模板引擎,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 浅谈Java源码ConcurrentHashMap

    浅谈Java源码ConcurrentHashMap

    最近刚入门java,觉得看源码挺有意思的,就记录一下一些常用类的源码吧,从而能够总结一些使用细节.本文对源码ConcurrentHashMap介绍的非常详细,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Java中的几种读取properties配置文件的方式

    Java中的几种读取properties配置文件的方式

    这篇文章主要介绍了Java中的几种读取properties配置文件的方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • IntelliJ IDEA2019 安装lombok的实现

    IntelliJ IDEA2019 安装lombok的实现

    这篇文章主要介绍了IntelliJ IDEA2019 安装lombok的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 利用Java实现mTLS调用

    利用Java实现mTLS调用

    这篇文章主要介绍使用 Java作为客户端 与受 mTLS 保护的服务交互。为了对我们的 Java 客户端进行 ssl 配置,我们需要先设置一个 SSLContext。这简化了事情,因为 SSLContext 可用于各种 http 客户端,接下来我们一起进入下面文章了解具体内容,需要的朋友可以参考一下
    2021-11-11
  • Spring循环依赖的解决方法详解

    Spring循环依赖的解决方法详解

    Spring的解决循环依赖是有前置条件的,要解决循环依赖我们首先要了解Spring Bean对象的创建过程和依赖注入的方式。依赖注入方式,我之前的博客有所分享,大家可以在看本篇文章之前进行一下小小的回顾
    2022-08-08
  • java 8 lambda表达式list操作分组、过滤、求和、最值、排序、去重代码详解

    java 8 lambda表达式list操作分组、过滤、求和、最值、排序、去重代码详解

    java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01

最新评论