我正在使用JPA而不是Hibernate。我的人际关系存在以下问题。我有一个1:N的关系( parent : child )。

在JSP站点上,显示“父级”和“子级”。
如果我是第一次加载JSP-Site,然后将父级与子级一起保存,则一切正常。父项已保存,子项也已通过外键保存到数据库。

之后,将显示带有父级和子级的第二个JSP站点。

但是,如果我回到第一个站点并将第二个子项(添加子项)保存到现有的父项中,则childEntityList仍然是旧的,我的意思是,新的子项不在此List内,而是插入数据库中。

为什么childEntityList很旧并且不更新?

家长:

@Entity
@Table(schema = "test", name = "Parent")
@XmlRootElement
@NamedQueries({...})
public class Parent implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "A_SEQ")
    @Basic(optional = false)
    @NotNull
    @Column(name = "ID")
    private int id;

    @OneToMany(mappedBy = "p", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<ChildEntity> childEntityList = new ArrayList<ChildEntity>();
    // ...

    public List<ChildEntity> getChildEntityList() {
        return childEntityList;
    }

    public void setChildEntityList(List<ChildEntity> childEntityList) {
        this.childEntityList = childEntityList;
    }

    public void addChildEntityToParent(ChildEntity c) {
        this.childEntityList.add(c);
        if(c.getParent() != this) {
            c.setParent(this);
        }
    }

    public void removeChildEntityFromParent(ChildEntity c) {
        childEntityList.remove(c);
    }
    // ...
}

child :
@Entity
@Table( name = "Child" )
@NamedQueries({...})
public class ChildEntity implements Serializable {
    @Id
    @GeneratedValue( strategy = GenerationType.IDENTITY )
    @Column( name = "CHILD_ID" )
    private Long childId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENT_ID")
    private Parent p;
    // ...

    public Parent getParent() {
        return p;
    }

    public void setParent(Parent p) {
        this.p= p;
        if(!p.getChildEntityList().contains(this)) {
            p.getChildEntityList().add(this);
        }
    }

保存代码:
Parent p = new Parent(...);
ChildEntity c = new ChildEntity(...);
p.addChildEntityToParent(c);
childEntityFacade.create(c);

查看代码:
// ...
public doSomething(Parent p) {
    super(p);
}
// ...
List<ChildEntity> cList = p.getChildEntityList();
System.out.print("Size: " + c.size());
// ...

在查看代码中,即使我添加了一个子代,childEntityList的大小每次都相同。
仅当我重新启动服务器时,才会显示“父级”的所有子级。

父类中的childEntityList何时填写?
由于@OneToMany是自动生成的吗?

有人可以解释吗?

更新:
我应该在每次从“父级”列表中添加/删除“子级”对象时合并EntityManager还是做其他事情?

最佳答案

您需要保持双向关系的双方。参见here

09-05 12:36