我有两个实体类: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不变。

07-26 07:50