【问题标题】:detached collection update problems分离集合更新问题
【发布时间】: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: 可能的非线程安全访问 会话

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

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

谢谢。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多