【问题标题】:remove object from session in hibernate? [duplicate]从休眠中的会话中删除对象? [复制]
【发布时间】:2011-03-18 08:38:02
【问题描述】:

可能重复:
Spring + Hibernate : a different object with the same identifier value was already associated with the session

我已经使用 hibernateTemplate 按 id 从 DB 中加载了一个对象 X,然后我从该对象中获取了一些属性,并将其添加到另一个对象 Y 中,该对象来自相同的类型,该对象也由相同的 X id 加载。然后当我尝试saveOrUpdate对象Y时,休眠抛出异常具有相同标识符值的不同对象已经与会话相关联,我认为这意味着对象X与该属性相关联同一个会话,所以 Y 不能被保存或更新并且也会影响那个属性。

如何从会话中删除对象 X,使其不再与该属性关联

我尝试使用合并而不是saveOrUpdate,它工作正常,但它与saveOrUpdate 一样吗?我的意思是我可以依靠它来添加新记录或更新它们吗?

【问题讨论】:

    标签: java hibernate spring


    【解决方案1】:

    经过多次尝试,我发现使用合并是有效处理此问题的最佳方法,并且要处理要保存的新实例,我认为最好的方法是这样做:

    if (X.getId() != null) {
        return hibernateTemplate.merge(X);
    } else {
        hibernateTemplate.saveOrUpdate(X);
    }
    

    因此,如果它是会话的新实例,它将通过saveOrUpdate 完成,如果它是相同行的重复实例,它将使用合并处理。

    【讨论】:

      【解决方案2】:

      也许你可以试试 session.evict()。

      【讨论】:

      • 我已经试过了,但它不起作用
      • 你能解释一下为什么你甚至需要对同一个对象的两个引用,X 和 Y?我认为 hibernate 保证在会话中,该对象只能有一个内存表示,因此 X 和 Y 指的是同一个实体。我认为您将不得不删除代码中的一个对象引用,因此当您将对象链接在一起时,必须删除 X 或 Y。我的理解:如果你使用 session.evict() 删除 X,它也会从 hibernate 的一级缓存中删除 Y。猜猜这就是它不起作用的原因。但是你不能删除 X 也不能删除 Y。
      • 好吧,在我的情况下,X 有一组 B,表示层采用该组并添加/更新/删除 B,在保存或更新时我想知道该组中的哪些元素已删除,所以我用 X 的相同 id 加载 Y 并在两者之间进行比较,然后更新 X 然后尝试保存它会引发问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      相关资源
      最近更新 更多