如何在Hibernate中删除可选关联实体且不删除其所属主实体
问题原因
你遇到的删除Portfolio连带删除关联User的问题是级联属性配置错误导致的:CascadeType.ALL包含了删除级联规则CascadeType.REMOVE,你在Portfolio类关联User的@OneToOne注解上加了这个配置,Hibernate就会在你删除Portfolio的时候自动执行关联User的删除操作。
修改方案
你只需要调整两个实体的级联配置即可满足需求:
- 修改Portfolio类的关联配置
移除Portfolio到User关联上的全量级联,仅保留你需要的持久化、更新级联即可,绝对不要保留删除级联:
/* * Portfolio是账户的集合 */ @Entity public class Portfolio { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; // 移除原来的cascade = CascadeType.ALL,有需要可以保留PERSIST、MERGE级联 @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name = "user_id") private User user; @OneToMany(fetch = FetchType.LAZY, mappedBy = "portfolio", cascade = CascadeType.ALL) private List<Account> accounts = new ArrayList<>(); // 省略构造方法、getter、setter }
如果不需要任何从Portfolio到User的级联操作,直接删除cascade参数即可。
- 可选调整User类的关联配置
User是关联的被维护端,现有cascade = CascadeType.ALL的作用是删除User时自动删除关联的Portfolio,符合你说的Portfolio必须关联User的业务逻辑,如果你需要保留这个规则可以不用修改;如果不需要删除User时连带删除Portfolio,可以调整级联配置:
@OneToOne(fetch = FetchType.LAZY, mappedBy = "user" ,cascade = {CascadeType.PERSIST, CascadeType.MERGE}) private Portfolio portfolio;
额外注意
删除Portfolio前建议先把关联User对象的portfolio属性置空,保存User后再执行Portfolio的删除,避免双向关联上下文的数据不一致。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

