我有两个实体类:UserConfirmation和User,它们是使用以下带注释代码的一对一关系:
家长/所有者实体(UserConfirmation):
@OneToOne(mappedBy = "userConfirmation", cascade = CascadeType.ALL)
@JsonManagedReference
private User user;
儿童实体(用户):
@OneToOne
@JoinColumn(name = "user_confirm_id")
@JsonBackReference
private UserConfirmation userConfirmation;
使用当前Cascade.ALL
,当我删除UserConfirmation时,其关联的用户也会被删除,这是我不想要的。我想在删除UserConfirmation后保留用户。
我尝试了以下内容:
在删除UserConfirmation之前将用户设置为null:userConfirmation.setUser(null);
但这会产生NullPointerException
尝试了Cascade.REMOVE以及Cascade上的几乎所有内容,但都没有。
您的帮助一如既往地受到赞赏:)
答案 0 :(得分:3)
如果不删除所有子端父外键关联,则无法删除父。
在您的示例中,您说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
不受影响。
答案 1 :(得分:0)
你在错误的一面使用了级联。
来自OneToOne.cascade
javadoc:
(可选)必须级联到关联的目标的操作。
在JPA中,您可以在SQL的对面定义级联操作。
您的代码应该看起来:
父母/所有者实体(UserConfirmation):
@OneToOne(mappedBy = "userConfirmation")
@JsonManagedReference
private User user;
儿童实体(用户):
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_confirm_id")
@JsonBackReference
private UserConfirmation userConfirmation;