OneToMany 中具有 CascadeType.ALL 的实体不持久化子项

问题描述 投票:0回答:1

我正在使用提供给我们团队的第三方库,其中一个实体与自身相同类型的实体具有一对多关系。我已更改实体名称以保持匿名。

可能有一种更好的方法来注释具有这种类型关系的实体,但由于它是由第三方提供的,我避免进行许多更改,以便它与未来的补丁和更新兼容。

它使用 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<>();
    }
}
jpa openjpa
1个回答
0
投票

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

将以下代码添加到 Person :

public class Person {
  .
  .
    
  @ManyToOne(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<>();
        }
    }

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

© www.soinside.com 2019 - 2024. All rights reserved.