代码之家  ›  专栏  ›  技术社区  ›  Nick

为什么当所有者实体失去对它们的引用时,JPA不会删除拥有的实体?

  •  1
  • Nick  · 技术社区  · 17 年前

    我有一个JPA实体“Request”,它拥有一个答案列表(也是JPA实体)。以下是它在Request.java中的定义:

    @OneToMany(cascade= CascadeType.ALL, mappedBy="request")
    private List<Answer> answerList;
    

    在Answer.java中:

    @JoinColumn(name = "request", referencedColumnName="id")
    @ManyToOne(optional = false)
    private Request request;
    

    这不是我想要的行为,就像我将一个请求合并到数据库中,然后再次获取它一样,它的答案列表可能不一样。我是否犯了一些编程错误?是否有注释或设置可以确保数据库中的答案与请求列表中的答案完全一致?

    一种解决方案是保留对原始答案列表的引用,然后在合并请求之前使用EntityManager删除每个旧答案,但似乎应该有一种更干净的方法。

    4 回复  |  直到 11 年前
        1
  •  1
  •   Will Hartung    16 年前

    在JPA 1.0中,JPA无法完成您想要做的事情。简单地说,所有关系管理都必须由应用程序完成,包括从集合中删除任何孤立项(这就是您要做的)。

    在JPA 2.0中,它们确实支持(尽管我不知道细节),但根据您的实现,升级可能并不容易或不可能。

    您也可以直接使用类似Hibernate的东西,但仍然使用许多JPA 1.0注释等。我也不能提供这方面的细节。

        2
  •  1
  •   Olli Knuuttila    16 年前

    使用EclipseLink并在answerList中添加@PrivateOwned注释会有所帮助。

        3
  •  0
  •   oakjumper    16 年前

    您可以在Request中使用@DependentElement注释。

        4
  •  0
  •   bert    16 年前

    如果你使用Hibernate作为JPA提供者,你可以添加一个

    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    

    在答案列表上。除了您已经在那里使用的JPA注释之外,这也可以工作。JPA 2(目前大多数/所有JPA提供者都没有生产就绪的实现)可以自己完成这项工作。