Hibernate:删除父/所有者,同时保持子对象的一对一关系

时间:2015-01-18 01:37:37

标签: java hibernate jpa hibernate-mapping cascade

我有两个实体类: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后保留用户。

我尝试了以下内容:

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

  2. 尝试了Cascade.REMOVE以及Cascade上的几乎所有内容,但都没有。

  3. 您的帮助一如既往地受到赞赏:)

2 个答案:

答案 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;