已删除的实体已传递给持久异常

时间:2010-02-01 16:34:58

标签: java hibernate jpa

我有这种实体:

  

文档      | n ..      至        .1 |   DocumentType      | 1 ..      至      .. n |   财产类型      | 1 ..      至      .. n |   DocumentProperty

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

但错误正在解决:

  

16:45:51,499 ERROR [[Seam Resource Servlet]] servlet的Servlet.service()Seam资源Servlet引发了异常   javax.persistence.EntityNotFoundException:传递给persist的已删除实体:[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级联,但问题仍然存在。

4 个答案:

答案 0 :(得分:12)

<强>解决方案:

  
      
  • @ManyToOne关系中有一个CascadeType.REMOVE!删除了它。
  •   

为何选择此解决方案?

  
      
  • 如果你想删除一个孩子,你肯定不想删除它的父母,因为可能有其他孩子与那个父母有关。
  •   

答案 1 :(得分:6)

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

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

并保留DELETE_ORPHAN

您可以然后,在验证您未在其他实体上手动调用remove()后,请尝试致电:

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

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

答案 2 :(得分:0)

我发现您在两个地方设置了cascade@OneToMany@Cascade。我认为这可能是一个问题,如果一个人压倒另一个......


您报告的错误需要更多上下文才能理解。 “删除已经删除的实体”显然涉及两个操作....你需要提供之前的状态,操作和状态的详细信息(“状态”,我的意思是数据库中的状态......)。 / p>

答案 3 :(得分:0)

似乎Cascade选项在某处使Entity Manager认为在调用em.remove(document)时需要保留链中的此对象或其他对象。需要更多细节...