【问题标题】:org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations):org.hibernate.ObjectDeletedException:已删除的对象将被级联重新保存(从关联中删除已删除的对象):
【发布时间】:2013-08-21 13:11:21
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

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

    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 自动删除。

    希望能帮到你

    【讨论】:

    • hibernate 用户应该使用它来移除孤儿 @Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      cascade = CascadeType.DETACH
      

      【讨论】:

        【解决方案4】:

        如果您通过 XML(而不是注释)执行此操作,以下是对我有用的解决方案:

        一对多关联:

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

        注意:session.flush() 很重要,因为 Hibernate 需要查看更改,

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          • 2011-08-26
          • 2013-10-03
          • 2019-06-30
          • 1970-01-01
          • 2018-02-05
          • 1970-01-01
          相关资源
          最近更新 更多