分离的集合更新问题

时间:2011-01-21 07:01:59

标签: java hibernate

我正在尝试使用一组分离的对象来执行完整的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:   可能的非线程安全访问   会话

执行此类操作的最不详尽的方法是什么。

注意:我需要在一个事务中发生这种情况,以防万一不起作用我不希望数据加载产生任何影响。

感谢。

1 个答案:

答案 0 :(得分:2)

你不应该,IMO,在再次保存之前删除所有实体。相反,我会

  • 找到所有实体,
  • 将新集合与找到的集合进行比较,并确定必须删除的实体
  • 删除这些实体
  • 合并其他的(使用merge方法,它将分离的实体的状态复制到附加的实体,即使它们已经在会话中)

请注意,第一步和第二步可以通过查找除了ID在您的分离实体集合中的那些实体之外的所有实体来完成:“从实体e中选择e,其中e.id不在(:idsOfDetachedEntities)”