休眠:删除 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 后保留用户。
我试过以下方法:
在删除 UserConfirmation 之前将用户设置为 null:userConfirmation.setUser(null);
但这会产生 NullPointerException
尝试了 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
应该是 parent 而 UserConfirmation
应该是 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;
现在您可以删除 UserConfirmation
而 User
保持不变。
我有两个实体 类: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 后保留用户。
我试过以下方法:
在删除 UserConfirmation 之前将用户设置为 null:
userConfirmation.setUser(null);
但这会产生 NullPointerException尝试了 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
应该是 parent 而 UserConfirmation
应该是 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;
现在您可以删除 UserConfirmation
而 User
保持不变。