Python 官方文档:入门教程 => 点击学习
目录对JpaEntity关系映射中mappedBy的理解对于mappedBy复习下举例说明spring-jpa中mappedBy的作用使用@JoinColumn存在的问题使用mapp
mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段数据库中1对多的关系,关联关系总是被多方维护的即外键建在多方,我们在单方对象的@OneToMany(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在维护他们之间的关联关系
mappedBy主要用于需要外键(存在于@OneToOne,@OneToMany,@ManyToMany中)的场景下,帮助我们进行外键管理。
在“一对多”的场景下,如果不使用mappedby,则一般是在“一方”和“多方”分别使用@joinColumn注解,帮助我们在“多方”和“一方”进行外键的维护,这样做的好处去掉多出来的一张关系映射表。
但是这会产生一个问题,就是执行的时候因为两方都要维护外键,所以在进行数据的增删时会执行冗余的update语句(update”多方“的外键),这些update语句是没有必要的。
因此,问题的解决就是需要我们只在“多方”来维护外键,为什么不在“一方'维护外键,因为这样”一方“为了维护外键还是会执行多余的update语句。
所以,我们需要在@OneToMany上使用mappedBy,值一般设为“多方”Entity类的外键数据成员名(注意不是数据库上的字段名,同时必须去掉@JoinColumn,不然会产生冲突)。这样就将外键的维护权交给“多方”,多方还是要使用@JoinColumn,并将值设为外键字段名,不然系统会自动帮我们设置一个外键字段。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: 对Jpa中Entity关系映射中mappedBy的全面理解
本文链接: https://lsjlt.com/news/159200.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0