休眠:删除 parent/owner,同时保持 child 在 one-to-one 关系中

Hibernate: delete the parent/owner while keeping the child in one-to-one relationship

我有两个实体 类:UserConfirmation 和 User,它们是 one-to-one 使用以下注释代码的关系:

Parent/Owner实体(用户确认):

@OneToOne(mappedBy = "userConfirmation", cascade = CascadeType.ALL)
    @JsonManagedReference
    private User user;

Child 实体(用户):

@OneToOne
@JoinColumn(name = "user_confirm_id")
@JsonBackReference
private UserConfirmation userConfirmation;

对于当前的 Cascade.ALL,当我删除 UserConfirmation 时,其关联的 User 也会被删除,这是我不希望的。我想在删除 UserConfirmation 后保留用户。

我试过以下方法:

  1. 在删除 UserConfirmation 之前将用户设置为 null:userConfirmation.setUser(null); 但这会产生 NullPointerException

  2. 尝试了 Cascade.REMOVE 和 Cascade 上的几乎所有内容,但 none 有效。

一如既往地感谢您的帮助:)

你在错误的一侧使用了级联。

来自 OneToOne.cascade javadoc:

(Optional) The operations that must be cascaded to the target of the association.

在 JPA 中,您可以在与 SQL 中相反的一侧定义级联操作。

您的代码实际应如下所示:

Parent/Owner实体(用户确认):

@OneToOne(mappedBy = "userConfirmation")
@JsonManagedReference
private User user;

子实体(用户):

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_confirm_id")
@JsonBackReference
private UserConfirmation userConfirmation;

您不能在不删除所有 child-side parent 外键关联的情况下删除 parent .

在您的示例中,您说 UserConfirmation 是 parent,User 是 child,但这是不正确的。

parent 一侧是独立于另一侧存在的一侧。在你的情况下 User 应该是 parentUserConfirmation 应该是 child 边.

因此,User 有:

@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
private UserConfirmation userConfirmation;

是 parent 级联 entity state transitions 到 children.

而 UserConfirmation 是 child,但它是 owner-side:

@OneToOne
@JoinColumn(name = "user_id")
@JsonBackReference
private User user;

现在您可以删除 UserConfirmationUser 保持不变。