2010-02-01 71 views
10

我有这样的实体:删除的实体被persist例外

文件 | n .. 至 ..1 | DocumentType | 1 .. 至 .. n | 物业类型 | 1 .. 至 .. n | DocumentProperty

我只是试图删除文件,如: entityManager.remove(文件);

但错误在烧成:

16:45:51499 ERROR [[煤层资源的Servlet] Servlet.service()为servlet的煤层资源的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所有它的工作。 但我需要它,也需要它EAGERLY。

有谁知道其他解决方案?

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

回答

12

解决方案:

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

为什么选择这种解决方案?

  • ,如果你想删除你当然不希望删除其母公司,因为有可能是与该父其他孩子一个孩子。
+3

是 - 这是我们隐藏的,因为你没有显示它;) – Bozho 2010-02-02 17:59:33

0

我看你在cascade设置在两个地方:@OneToMany@Cascade。我觉得这可能是一个问题,如果一个覆盖其他...


错误要报告需要一些更多的上下文可以理解的。 “删除一个已经被删除的实体”明确地涉及到两个操作......你需要提供关于状态之前,操作和状态之后的细节(“状态”,我的意思是数据库中的状态......)。

+0

嗨,我刚刚添加了DELETE_ORPHAN级联,只是为了克服一个解决方案,但似乎不是问题。无论如何,我通过DELETE做一个简单的休息调用,发送一个将被删除的文档ID,所以......一个非常简单的场景。 – 2010-02-01 17:01:00

+0

根据hibernate docs(懒得现在看它)'@ Cascade' _adds_到JPA'cascade'属性,并不会覆盖它。 – Bozho 2010-02-02 09:22:32

+0

@Bozho感谢这个精度,理论上;-)。我希望有人在实践中测试这个,也许克里斯蒂安? :-) – KLE 2010-02-02 14:47:27

0

看起来像Cascade选项是让实体管理器认为当调用em.remove(document)时,该对象或链中的某个其他对象需要被持久化。需要更多具体信息...

6

我假设你在PropertyType之前曾拨打remove()。呼叫remove()只对“根”的实体,并且用类似删除他人:

​​

并保留DELETE_ORPHAN

可以然后,核实后你有没有手动的另一种叫remove()实体,尝试调用:

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

使得EntityManager第一重新关联与会话对象。

+0

嗨Bozho。我打电话给文件删除,我期待其他实体将通过级联删除。调用document.getDocumentType()。getPropertyTypes()。remove(propertyType);我需要做一个foreach属性设置,当我删除一个,异常被解雇,因为属性类型的数量不会保持不变... – 2010-02-02 07:17:56

+0

tripple检查你是否调用删除某处;)然后看到我的更新 – Bozho 2010-02-02 07:31:58

相关问题