阅读 186

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

这篇文章主要介绍了对Jpa中Entity关系映射中mappedBy的全面理解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

    • 对于mappedBy复习下

    • 举例说明

  • Spring-jpa中mappedBy的作用

    • 使用@JoinColumn存在的问题

    • 使用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中配置有:

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

Game中配置有:

1
2
3
4
5
6
7
@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

1
2
3
4
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

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

以上为个人经验,希望能给大家一个参考

原文链接:https://www.cnblogs.com/hyl8218/p/10535886.html


文章分类
百科问答
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐