【问题标题】:Hibernate: delete the parent/owner while keeping the child in one-to-one relationshipHibernate:删除父/所有者,同时保持孩子一对一的关系
【发布时间】:2015-03-16 09:03:04
【问题描述】:

我有两个实体类: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 时,其关联的用户也会被删除,这是我不想要的。我想在删除用户确认后保留用户。

我尝试了以下方法:

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

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

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

【问题讨论】:

    标签: java hibernate jpa hibernate-mapping cascade


    【解决方案1】:

    你用错了级联。

    来自OneToOne.cascadejavadoc

    (可选)必须级联到关联的目标的操作。

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

    您的代码实际上应该是这样的:

    父/所有者实体 (UserConfirmation):

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

    子实体(用户):

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

    【讨论】:

    • 如何定义关联的目标?它是双向的
    • 目标取决于您放置注释的位置。如果您在userConfirmation 字段上输入User 类,那么它将指向UserConfirmation。因此UserConfirmation 的实例被视为关联的目标。
    【解决方案2】:

    如果不删除所有 child-side 父外键关联,则无法删除

    在您的示例中,您说UserConfirmation 是父级,User 是子级,但这是不正确的。

    父方是独立于另一方存在的一方。在您的情况下,User 应该是 parentUserConfirmation 应该是 child 端。

    所以,User 有:

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

    父级将entity state transitions 级联给子级。

    UserConfirmation 是孩子,但它是所有者:

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

    现在您可以删除UserConfirmation,同时保持User 不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2022-06-10
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多