我有这种实体:
文档 | 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级联,但问题仍然存在。
答案 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)时需要保留链中的此对象或其他对象。需要更多细节...