从休眠中的会话中删除对象? [复制]

Posted

技术标签:

【中文标题】从休眠中的会话中删除对象? [复制]【英文标题】: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 一样吗?我的意思是我可以依靠它来添加新记录或更新它们吗?

【问题讨论】:

【参考方案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 然后尝试保存它会引发问题

以上是关于从休眠中的会话中删除对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何从休眠会话中获取 jdbc 连接? [复制]

打开会话的休眠异常。我该如何调试呢?

如何从 R 中的特定包中分离所有对象和方法? [复制]

异常 ORA-00942: 表或视图不存在 - 使用休眠会话插入现有表时

从对象列表中的属性中删除空格? [复制]

休眠“在视图中打开会话”和异步任务