【问题标题】:Hibernate deletion issue休眠删除问题
【发布时间】:2011-02-16 16:26:34
【问题描述】:

我正在尝试编写一个导入数据文件的 Java 应用程序。流程如下

  1. 创建交易
  2. 从数据表中删除所有行
  3. 将数据文件加载到数据表中
  4. 如果遇到任何错误,则提交或回滚。

第 3 步加载的数据与第 3 步删除的数据大体相同。

使用以下方式执行删除

DetachedCriteria criteria = DetachedCriteria.forClass(myObject.class);
List<myObject> myObjects = hibernateTemplate.findByCriteria(criteria);
hibernateTemplate.deleteAll(myObjects);

当我加载数据文件时,我得到以下异常

nested exception is org.hibernate.NonUniqueObjectException: 
a different object with the same identifier value was already associated with the session:

整个过程需要在事务中进行。 而且我真的不想比较导入文件/数据表,然后执行插入/更新/删除以使它们同步。

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql hibernate spring transactions


    【解决方案1】:

    最短答案,使用session.merge()

    简短的回答,使用普通 jdbc 休眠是这项工作的错误工具。

    更长的答案,看看你的数据库工具在这方面支持什么。
    一个解决方案可能是:

    1. 重命名表 old_table
    2. 新建一个空表
    3. 将数据导入新表
    4. 删除旧表

    您的整个表将被锁定在您的用例中,所以这应该不是问题。

    【讨论】:

    • 可能是最简单的解决方案。不幸的是,我们使用的数据库帐户只有更新/插入/删除访问权限。我可能不得不使用 nsert/update/delete 而不是全部删除... ta
    【解决方案2】:

    第一个想法:在第 2 步之后,您是否尝试过 flush() Session

    第二个想法:使用the StatelessSession interface。您可能需要为此扩展 HibernateTemplate,因为 SPR-6202SPR-2495 尚未解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 2015-05-31
      • 2013-02-15
      • 2015-08-01
      • 2012-09-17
      相关资源
      最近更新 更多