从休眠中的会话中删除对象? [复制]
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 然后尝试保存它会引发问题以上是关于从休眠中的会话中删除对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章