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

2022-08-31 05:17:57

我想我误解了在关系背景下级联的含义。@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.ALLcascade = CascadeType.ALLUser


答案 1

的含义是持久性将所有操作(级联)传播()到相关实体。CascadeType.ALLEntityManagerPERSIST, REMOVE, REFRESH, MERGE, DETACH

在您的情况下,这似乎是一个坏主意,因为删除会导致删除相关的.由于用户可以有多个地址,因此其他地址将成为孤立地址。但是,逆情况(注释 )是有意义的 - 如果地址仅属于单个用户,则在删除该用户时,可以安全地传播删除属于该用户的所有地址。AddressUserUser

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


答案 2

不应使用 on,因为实体状态转换应从父实体传播到子实体,而不是相反。CascadeType.ALL@ManyToOne

这边始终是子关联,因为它映射基础外键列。@ManyToOne

因此,您应该将 从关联移动到一侧,该关联也应使用该属性,因为它是最有效的一对多表关系映射。CascadeType.ALL@ManyToOne@OneToManymappedBy


推荐