OneToMan中具有CascadeType.ALL的实体不持久存在子级

时间:2019-01-27 16:50:18

标签: jpa openjpa

我正在与提供给我们团队的第三方图书馆合作,其中一个实体与自身相同类型的实体具有OneToMany关系。我更改了实体名称以使其保持匿名。

也许有一种更好的方法来注释具有这种类型关系的实体,但是由于它是由第三方提供的,因此我避免进行许多更改,以使其与将来的补丁程序和更新兼容。

它使用的是OpenJPA 2.4.0-ep2.0

@Entity
@Table(name =  Person.TABLE_NAME)
public class Person {
private Long parentUid;
private List<Person> children = new ArrayList<>();

@OneToMany(targetEntity = Person.class, cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@ElementJoinColumn(name = "PARENT_UID")
@ElementForeignKey
@ElementDependent
public List<Person> getChildren() {
    return this.children;
}

}

当我试图让一个有孩子的人坚持下去时,只有主要实体得到坚持,而孩子们却被忽略了。

但是,如果我将fetch属性更改为FetchType.EAGER,它将起作用(它同时保留父项和子项)。我的理解是,访存类型仅影响加载,而不影响插入。任何想法为什么会发生吗?

还可以在使获取类型保持为FetchType.LAZY的同时使它工作吗?

我尝试了以下操作(修改设置器):

protected void setChildren(final List<Person> children) {
    if (Objects.nonNull(children)) {
        for (Person child : children) {
            child.setParentUid(parentUid);
        }
        this.childItems = children;
    } else  {
        this.childItems = new ArrayList<>();
    }
}

1 个答案:

答案 0 :(得分:0)

问题在子实体中,您应该在子实体中使用@ManyToOne注释。

将以下代码添加到Person:

public class person {
            .
            .

           @MantToOne(fetch=FetchType.LAZY)
           @JoinClolumn(name="PARENT_UID")
           private Person parent;

             public void setParent(Person parent){
             }
              .
              .

        }

然后修改setChildren代码,如下所示:

 protected void setChildren(final List<Person> children) {
        if (Objects.nonNull(children)) {
            for (Person child : children) {
                child.setParent(this);
            }
            this.childItems = children;
        } else  {
            this.childItems = new ArrayList<>();
        }
    }

重要的一点是“始终必须在父级和子级中同步获取类型”。