为了账号安全,请及时绑定邮箱和手机立即绑定

对于@ManyToOne JPA关联,CascadeType.ALL的含义是什么?

对于@ManyToOne JPA关联,CascadeType.ALL的含义是什么?

qq_花开花谢_0 2019-08-15 15:22:31
对于@ManyToOne JPA关联,CascadeType.ALL的含义是什么?我想我误解了在@ManyToOne关系背景下级联的意义。案子:public class User {    @OneToMany(fetch = FetchType.EAGER)    protected Set<Address> userAddresses;}public class Address {    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)    protected User addressOwner;}这是什么意思cascade = CascadeType.ALL?例如,如果我从数据库中删除某个地址,我添加的事实如何cascade = CascadeType.ALL影响我的数据(User我猜)?
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

意思CascadeType.ALL是持久性将所有EntityManager操作(PERSIST, REMOVE, REFRESH, MERGE, DETACH)传播(级联)到相关实体。

在你的情况下似乎是一个坏主意,因为删除Address会导致删除相关的User。由于用户可以拥有多个地址,因此其他地址将成为孤儿。然而,相反的情况(注释User)将是有意义的 - 如果地址仅属于单个用户,则如果删除该用户,则传播删除属于用户的所有地址是安全的。

顺便说一句:您可能希望向您添加一个mappedBy="addressOwner"属性,User以向持久性提供程序发出连接列应位于ADDRESS表中的信号。


查看完整回答
反对 回复 2019-08-15
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

从EJB3.0规范

可以使用级联注释元素来将操作的效果传播到关联实体。级联功能最常用于父子关系。

如果X是托管实体,则删除操作会导致其被删除。如果从X到这些其他实体的关系使用cascade = REMOVE或cascade = ALL注释元素值进行注释,则删除操作将级联到由X引用的实体。

简而言之,定义的实体关系CascadeType.All将确保所有持久性事件(如父级上发生的持久性,刷新,合并和删除)将传递给子级。定义其他CascadeType选项为开发人员提供了对实体关联如何处理持久性的更细粒度控制。

例如,如果我有一个包含页面列表的对象书,我在此列表中添加一个页面对象。如果@OneToMany定义Book和Page之间关联的注释被标记为CascadeType.All,则持久化Book将导致Page也被持久化到数据库。


查看完整回答
反对 回复 2019-08-15
  • 3 回答
  • 0 关注
  • 3730 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号