我使用hibernateTemplate find by id从DB加载了一个对象X,然后我从该对象获取了一些属性,并将它添加到同一类型的另一个对象Y中,该对象也由相同的X id加载。然后当我尝试saveOrUpdate
对象Y时,hibernate抛出异常一个不同的对象,其中相同的标识符值已经与会话相关联,我认为这意味着对象X与该属性相关联在同一个会话中,因此无法保存或更新Y,也会影响该属性。
如何从会话中删除对象X,使其不再与该属性相关联
我尝试使用合并而不是saveOrUpdate
并且它工作正常,但是它与saveOrUpdate
相同吗?我的意思是我可以依赖它来添加新记录或更新它们吗?
答案 0 :(得分:2)
经过多次尝试后,我发现使用merge是有效处理这种情况的最佳方法,并且为了保存新实例,我认为最好的方法是:
if (X.getId() != null) {
return hibernateTemplate.merge(X);
} else {
hibernateTemplate.saveOrUpdate(X);
}
因此,如果它是一个新的会话实例,它将通过saveOrUpdate
完成,如果它是相同行的重复实例,它将使用merge进行处理。
答案 1 :(得分:0)
也许你可以尝试session.evict()。