对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