org.hibernate.ObjectDeletedException:已删除的对象将通过级联重新保存(从关联中删除已删除的对象):

时间:2013-08-21 13:11:21

标签: hibernate

我收到上述错误“org.hibernate.ObjectDeletedException:已删除的对象将通过级联重新保存(从关联中删除已删除的对象):”。有人可以帮我解决可能存在的问题以及应该解决的问题吗?

感谢。

4 个答案:

答案 0 :(得分:17)

没有映射结束代码有点难... 这通常是因为您要删除与集合相关联的对象 您必须从拥有集合中删除对象,然后删除对象

parentObject.collection.remove(objToDelete);
session.delete(objToDelete);
session.save(parentObject);

但你可以使用deleteOrphan以这种方式映射集合来避免这种情况

class ParentObject {
  @OneToMany(orphanRemoval=true)
  private List<ChildObject> collection;
}

和代码看起来像

parentObject.collection.remove(objToDelete);
session.save(parentObject);

您不需要删除对象,因为在保存parentObject时它会被Hibernate自动删除。

希望可以提供帮助

答案 1 :(得分:5)

您已在会话中删除了实体(A),但它被另一个实体引用并使用Cascade注释进行了分配。该引用将导致实体(A)立即重新处理。因为这可能不是你想要的,所以hibernate抱怨。

解决方案是找到实体可通过的所有引用(包括集合),并将它们设置为null /从集合中删除实体。

你可以改变你的删除逻辑:制作一个删除孤儿的引用(如果只有一个),然后将其删除,如@bellabax所述。

答案 2 :(得分:2)

此异常告诉您正在删除的Object也会映射到任何实体的集合,并且您在该集合中的级联都是id。因此,如果您想删除任何方式,您可以将级联更改为

cascade = CascadeType.DETACH

答案 3 :(得分:0)

如果你是通过XML(而不是注释)来做这件事,下面是一个对我有用的解决方案:

一对多关联:

  1. 从中的任何集合中删除子对象的任何链接 父对象[注意:如果你正在做一对一的关联,那就是 将父对象中的子对象引用设置为“null”]
  2. 从数据库中删除子对象
  3. 使用session.flush()
  4. 刷新更改
  5. 将父对象链接到新子对象
  6. 保存父对象6)提交更改
  7. 注意:session.flush()非常重要,因为Hibernate需要查看更改,

    如果您无法刷新会话,我建议您在其他交易中执行步骤(1,2),然后在新交易中执行步骤(4,5,6)。