我有两个实体类:UserConfirmation和User,它们使用下面的带注释的代码一对一关系:
父/所有者实体(用户确认):
@OneToOne(mappedBy = "userConfirmation", cascade = CascadeType.ALL)
@JsonManagedReference
private User user;
子实体(用户):
@OneToOne
@JoinColumn(name = "user_confirm_id")
@JsonBackReference
private UserConfirmation userConfirmation;
使用当前的
Cascade.ALL
,当我删除UserConfirmation时,与之关联的User也将被删除,这是我不希望的。我想在删除UserConfirmation后保留User。我尝试了以下方法:
在删除UserConfirmation之前将用户设置为null:
userConfirmation.setUser(null);
但这给出了NullPointerException尝试了Cascade.REMOVE以及Cascade上的几乎所有内容,但没有任何效果。
一如既往地感谢您的帮助:)
最佳答案
您必须先删除所有子级的父级外键关联才能删除父级。
在您的示例中,您说UserConfirmation
是父级,而User
是子级,但这是不正确的。
父母一方是独立于另一方存在的一方。在您的情况下,User
应该是父方,而UserConfirmation
应该是子方。
因此,User
具有:
@OneToOne
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
private UserConfirmation userConfirmation;
是父级将entity state transitions级联为子级。
UserConfirmation是孩子,但它是所有者:
@OneToOne
@JoinColumn(name = "user_id")
@JsonBackReference
private User user;
现在,您可以删除
UserConfirmation
,同时保持User
不变。