我认为我误解了@ManyToOne关系中级联的含义。
@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我猜是)?
cascade = CascadeType.ALL
含义CascadeType.ALL是,持久性会将所有EntityManager操作(PERSIST, REMOVE, REFRESH, MERGE, DETACH)传播(层叠)到相关实体。
CascadeType.ALL
EntityManager
PERSIST, REMOVE, REFRESH, MERGE, DETACH
在你的情况下,似乎是个坏主意,因为删除Address会导致删除related User。由于用户可以具有多个地址,因此其他地址将成为孤立地址。但是,相反的情况(用注释User)将是有道理的-如果一个地址仅属于一个用户,则删除该用户可以安全地传播对属于该用户的所有地址的删除。
Address
related User
User
顺便说一句:你可能想向你添加一个mappedBy="addressOwner"属性,User以向持久性提供程序发出信号,表明连接列应位于ADDRESS表中。
mappedBy="addressOwner"
ADDRESS