【问题标题】:Deleted entity passed to persist exception已删除的实体传递给持久异常
【发布时间】:2010-02-01 16:34:58
【问题描述】:

我有这种实体:

文档 | n .. 到 ..1 | 文档类型 | 1.. 到 .. n | 财产种类 | 1.. 到 .. n | 文档属性

我只是尝试删除以下文档: entityManager.remove(文档);

但发生错误:

16:45:51,499 ERROR [[Seam Resource Servlet]] Servlet.service() for servlet Seam Resource Servlet 抛出异常 javax.persistence.EntityNotFoundException:已删除的实体传递给持久化:[up.docstore.PropertyType#]

问题似乎来自这里:

@OneToMany(mappedBy = "documentType", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@ForeignKey(name = "FK_DOCUMENT_TYPE__PROPERTY_TYPE")
@Sort(type = SortType.NATURAL)
private SortedSet<PropertyType> propertyTypes = new TreeSet<PropertyType>();

如果我删除 CascadeType.PERSIST 一切正常。 但我需要它,我也很需要它。

有人知道其他解决方案吗?

编辑:删除了 DELETE_ORPHAN 级联,但仍然是同样的问题。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    解决方案:

    • @ManyToOne 关系中有一个 CascadeType.REMOVE !已将其删除。

    为什么采用这种解决方案?

    • 如果您想删除一个孩子,您肯定不想删除其父级,因为可能还有其他与该父级相关的孩子。

    【讨论】:

      【解决方案2】:

      我假设您之前在 PropertyType 类型上调用过 remove()。仅为“根”实体调用remove(),并使用以下内容删除其他实体:

      document.getDocumentType().getPropertyTypes().remove(propertyType);
      

      并保留DELETE_ORPHAN

      您可以然后,在确认您没有在其他实体上手动调用remove()后,尝试调用:

      document = entityManager.merge(document);
      entityManager.remove(document);
      

      以便EntityManager 首先将对象与会话重新关联。

      【讨论】:

      • 你好,博卓。我只对文档调用 remove,我期望其余的实体将通过级联删除。调用 document.getDocumentType().getPropertyTypes().remove(propertyType);我需要对属性集进行 foreach,当我删除一个时,会触发异常,因为属性类型的数量不会保持不变......
      • 三次检查你是否没有在某处调用 remove ;) 然后查看我的更新
      【解决方案3】:

      我看到你在两个地方设置了cascade@OneToMany@Cascade。我认为这可能是一个问题,如果一个覆盖另一个......


      您报告的错误需要更多上下文才能理解。 “删除已删除的实体”显然涉及两个操作....您需要详细说明之前的状态、操作和之后的状态(“状态”是指数据库中的状态...)。

      【讨论】:

      • 嗨,我刚刚添加了 DELETE_ORPHAN 级联,只是为了解决问题,但似乎这不是问题。无论如何,我通过 DELETE 做了一个简单的休息调用,发送一个将被删除的文档 id,所以......一个非常简单的场景。
      • 根据休眠文档(现在懒得找它)@Cascade 添加到 JPA cascade 属性,不会覆盖它。
      • @Bozho 理论上感谢您提供的精确度;-)。我希望有人在实践中对此进行测试,也许是克里斯蒂安? :-)
      【解决方案4】:

      当您调用 em.remove(document) 时,似乎 Cascade 选项使实体管理器认为该对象或链中的其他对象需要被持久化。需要更多细节...

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        • 2013-11-05
        • 2018-09-10
        • 1970-01-01
        • 2015-11-04
        • 2021-02-02
        相关资源
        最近更新 更多