【发布时间】:2011-01-21 07:01:58
【问题描述】:
我正在尝试使用一组分离的对象进行完整的 CRUD(即它们是在不使用休眠的情况下创建的,并且与会话无关)。
项目的 ID 是用户定义的(不是生成的)。
该集合包含数据库中已存在的条目和数据库中不存在的条目。
应该更新现有条目,应该插入新条目。
应删除数据库中存在但集合中不存在的任何条目。
到目前为止,我一直在尝试先从数据库中删除所有条目,然后对集合中的每个项目执行 saveOrUpdate:
for (Object entity : session.createCriteria(type).list())
session.delete(entity);
for (Object entity : collection)
session.saveOrUpdate(entity);
但是这会导致错误
不同的对象具有相同的 标识符值已经 与会话关联
我认为这是因为删除循环正在将一个对象加载到会话中,然后我试图稍后保存具有相同 ID 的不同对象,所以我更改了代码以便逐出每个删除实体:
for (Object entity : session.createCriteria(type).list())
{
session.delete(entity);
session.evict(entity);
}
for (Object entity : collection)
session.saveOrUpdate(entity);
现在我得到了
org.hibernate.AssertionFailure: 可能的非线程安全访问 会话
执行此类操作最不详尽的方法是什么。
注意:我需要在一个事务中发生这种情况,以防万一任何事情都不起作用,我不希望数据加载产生任何影响。
谢谢。
【问题讨论】: