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

org.hibernate.ObjectDeletedException:删除的对象将通过级联重新保存(从关联中删除删除的对象):,hibernate,Hibernate,我收到上面的错误“org.hibernate.ObjectDeletedException:已删除的对象将通过级联重新保存(从关联中删除已删除的对象):”。有人能帮我解决什么问题吗 谢谢。没有映射结束代码有点难。。。 这通常是因为您正在删除与集合关联的对象。 您必须从拥有的集合中删除对象,然后删除对象 parentObject.collection.remove(objToDelete); session.delete(objToDelete); session.save(parentObjec

我收到上面的错误“org.hibernate.ObjectDeletedException:已删除的对象将通过级联重新保存(从关联中删除已删除的对象):”。有人能帮我解决什么问题吗


谢谢。

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

parentObject.collection.remove(objToDelete);
session.delete(objToDelete);
session.save(parentObject);
但您可以通过这种方式使用deleteOrphant来避免这种情况

class ParentObject {
  @OneToMany(orphanRemoval=true)
  private List<ChildObject> collection;
}
您不再需要删除对象,因为在保存parentObject时,Hibernate会自动删除该对象


希望可以帮助您

您已在会话中删除了一个实体(A),但它被另一个实体引用,并带有级联注释。该引用将导致立即重新创建实体(A)。因为这可能不是您想要的,hibernate会抱怨

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


您可以改变删除逻辑:将引用(如果只有一个)设为删除孤立项,然后按照@bellabax所述将其删除。

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

cascade = CascadeType.DETACH

如果您是通过XML(而不是注释)来实现这一点,下面是一个适合我的解决方案:

一对多协会:

  • 从中的任何集合中删除子对象的任何链接 父对象[注意:如果您正在进行一对一关联,只需 将父对象中的子对象引用设置为“null”]
  • 从数据库中删除子对象
  • 使用session.flush()刷新更改
  • 将父对象链接到新的子对象
  • 保存父对象6)提交更改
  • 警告:session.flush()很重要,因为Hibernate需要查看更改


    如果您无法刷新会话,我建议您在另一个事务中执行步骤(1,2),然后在新事务中执行步骤(4,5,6)。

    hibernate用户应将其用于孤儿删除@Cascade({org.hibernate.annotations.CascadeType.DELETE_orphan})
    cascade = CascadeType.DETACH