2010-07-20 57 views
1

可能重复:
Spring + Hibernate : a different object with the same identifier value was already associated with the session从休眠中的会话中删除对象?

我已经加载从DB使用的HibernateTemplate根据ID找到一个对象X,然后我得到来自该对象的某些属性,把它添加到另一个对象ÿ来自同一个X id加载的类型。然后,当我尝试saveOrUpdate对象Y时,hibernate抛出异常具有相同标识符值的不同对象已与会话相关联,我认为这意味着对象X在同一会话中与该属性关联,因此Y可以'保存或更新并且也影响该属性。

如何从会话中删除对象X,所以它不再与该属性

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

回答

2

了很多的尝试之后,我发现,使用合并是最好的办法,有效地处理这个问题,并照顾新实例来保存我认为最好的办法是要做到这一点:

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

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

0

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

+0

我已经试过了,但它不起作用 – 2010-07-20 12:02:36

+0

你能解释为什么你甚至需要两个引用X和Y到同一个对象吗? 我认为hibernate保证在一个会话中,该对象只能有一个内存中表示,所以X和Y指的是同一个实体。我认为你将不得不在你的代码中删除一个对象引用,所以当你将objcets链接在一起时,X或者Y将不得不去掉。 我的理解是:如果使用session.evict()去除X,它也会从Yibernate的第一级缓存中删除Y.猜猜这就是为什么它不起作用。但你不能删除X,也不能删除Y. – 2010-07-20 12:35:03

+2

好的,在我的情况下,X有一组Bs,表示层采用这个集合并添加/更新/删除Bs,当保存或更新时,我想知道哪些元素来自这个集合删除,所以我加载与X相同的ID和两者之间的比较,然后更新X然后试图保存它引发问题 – 2010-07-20 13:04:49