6

我使用的是 JPA 而不是休眠。我的关系有如下问题。我有一个 1:N 的关系(父母:孩子)。

在 JSP 站点上,将显示父项和子项。如果我(第一次)加载 JSP-Site 并保存一个父级和一个子级,一切都很好。父母被保存,孩子也被保存到带有外键的数据库中。

之后,将显示第二个 JSP-Site,其中包含 Parent 和 Children。

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

为什么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);
    }
    // ...
}

孩子:

@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());
// ...

在 View-Code 中,childEntityList即使我添加了一个 Child,每次的大小都是相同的。只有当我重新启动服务器时,才会显示父级的所有子级。

什么时候childEntityList填写父类中的?它是自动的,因为@OneToMany?

有人可以解释一下吗?

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

4

3 回答 3

5

您需要保持双向关系的双方。见这里

于 2013-01-08T14:43:07.210 回答
1

(我使用的是 JPA 而不是 Hibernate!)

我猜你的意思是你没有使用 Hibernate API。
JPA 只是一个持久性 API 规范,它本身什么也不做。
所以,如果你使用 JPA ......你正在使用一些东西来做持久性。

JPA 将持久性工作委托给持久性引擎,例如 Hibernate、EclipseLink、OpenJPA 或其他东西。

您可以将应用程序配置为使用具有特定持久性提供程序的 JPA 接口,或者如果应用程序在 JEE 容器中运行,则应为您提供 JPA 实现:GlassFish(使用 OpenJPA)、WebLogic(使用 EclipseLink)、TomEE(使用 OpenJPA)。

每次我从父列表中添加/删除子对象时,我是否应该合并 EntityManager...

您不合并 EntityManager;你用它来合并父实体:

parent = em.merge(parent);

关于您的问题,当您以这种方式使用 merge() 时......(并且因为映射指定 CascadeType.ALL)然后在重新加载页面(“站点 1”)时,您应该获得刷新的父对象,其中包含更新的对象网络您在 merge(parent) 之前所做的更改,包括任何新添加的子项。

于 2015-10-21T00:21:41.160 回答
0

是的,您需要合并父实体。我遇到了同样的问题,一旦我合并了父实体,它就得到了解决。你也需要维护双方的关系。

于 2014-08-29T06:02:35.803 回答