JPA 孤立项删除不适用于一对一关系

2022-09-02 01:38:10

有没有人有解决此问题的方法:https://hibernate.atlassian.net/browse/HHH-9663

我也面临着类似的问题。当我在两个实体之间创建一对一(无反向引用)关系并将孤立删除属性设置为 true 时,在将引用设置为 null 后,引用的对象仍在数据库中。

下面是示例域模型:

@Entity
public class Parent {
  ...
  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  @JoinColumn(name = "child_id")
  private Child child;
  ...
}

@Entity
public class Child {
  ...
  @Lob
   private byte[] data;
  ...
}

我目前正在通过手动删除孤立项来解决此问题。


答案 1

级联仅对从父项传播到项的实体状态转换有意义。在你的例子中,父母实际上是这个协会的子级(有FK)。

请尝试使用此映射:

@Entity
public class Parent {
  ...
  @OneToOne(
      fetch = FetchType.LAZY, 
      cascade = CascadeType.ALL, 
      orphanRemoval = true, 
      mappedBy = "parent"
  )
  private Child child;
  ...
}

@Entity
public class Child {

    @OneToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;

    ...
    @Lob
    private byte[] data;
    ...
}

要级联孤立项删除,您现在需要:

Parent parent = ...;
parent.getChild().setParent(null);
parent.setChild(null);

或者更好的是,在实体类中组合方法以设置这两个关联:setChildParent

public void setChild(Child child) {
    if (child == null) {
        if (this.child != null) {
            this.child.setParent(null);
        }
    }
    else {
        child.setParent(this);
    }
    this.child = child;
}

答案 2

推荐