我正在尝试使用一组分离的对象来执行完整的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: 可能的非线程安全访问 会话
执行此类操作的最不详尽的方法是什么。
注意:我需要在一个事务中发生这种情况,以防万一不起作用我不希望数据加载产生任何影响。
感谢。
答案 0 :(得分:2)
你不应该,IMO,在再次保存之前删除所有实体。相反,我会
请注意,第一步和第二步可以通过查找除了ID在您的分离实体集合中的那些实体之外的所有实体来完成:“从实体e中选择e,其中e.id不在(:idsOfDetachedEntities)”