@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 )?

原文由 forhas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 599
2 个回答

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

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

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

原文由 kostja 发布,翻译遵循 CC BY-SA 3.0 许可协议

您不应该在 --- CascadeType.ALL @ManyToOne 因为实体状态转换应该从父实体传播到子实体,而不是相反。

@ManyToOne 位于关联的子端,因为它映射基础外键列。

Therefore, you should move the CascadeType.ALL from the @ManyToOne association to the @OneToMany side, which should also use the mappedBy attribute since it’s the最有效的一对多表关系映射。

原文由 Vlad Mihalcea 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题