在hibernate中从会话中删除对象?

时间:2010-07-20 09:59:39

标签: java hibernate spring

  

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

我使用hibernateTemplate find by id从DB加载了一个对象X,然后我从该对象获取了一些属性,并将它添加到同一类型的另一个对象Y中,该对象也由相同的X id加载。然后当我尝试saveOrUpdate对象Y时,hibernate抛出异常一个不同的对象,其中相同的标识符值已经与会话相关联,我认为这意味着对象X与该属性相关联在同一个会话中,因此无法保存或更新Y,也会影响该属性。

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

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

2 个答案:

答案 0 :(得分:2)

经过多次尝试后,我发现使用merge是有效处理这种情况的最佳方法,并且为了保存新实例,我认为最好的方法是:

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

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

答案 1 :(得分:0)

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