【问题标题】:Hibernate Transaction Query休眠事务查询
【发布时间】:2015-09-06 20:03:53
【问题描述】:

我有一个 Hibernate Transaction 的查询。

在我的应用程序中,我有应该作为一个整体插入或不插入的数据列表。根据业务逻辑,我需要从该表中删除所有数据并添加插入完整列表。列表包含超过 100k 条记录。以下是我的交易代码。这是错误的,因为它没有回滚,因为对于太长的数据有一个查询异常。你能告诉我其中有什么问题吗?

public boolean deleteAndSaveAll(ArrayList<MyData> listBean) throws Exception {

    boolean transactionCompleted = false;

    Session session = HibernateUtils.currentSession();

    Transaction tx = session.beginTransaction();

    try {
        String stringQuery = "DELETE FROM MyData";
        Query query = session.createQuery(stringQuery);
        query.executeUpdate();

        for (MyData MyData : listBean) {
        session.save(MyData);
        }

        tx.commit();
        transactionCompleted = true;
    } catch (Exception e) {
        MyUtils.log("DAO: MyDataDAO error while deleteAndSaveAll : "+e.getMessage());
        e.printStackTrace();
        if(tx != null){
        tx.rollback();
        }
        throw e;
    }finally{
        HibernateUtils.closeSession();
    }

    return transactionCompleted;
}

【问题讨论】:

  • 你应该做检查点并回滚到上次保存检查点
  • 但是几乎每个地方的hibernate例子都给出了这样的例子。不知道为什么它不起作用。还是谢谢你的建议。我会搜索相同的。

标签: java mysql hibernate


【解决方案1】:

我找不到适合此问题的解决方案。

所以我需要使用存储过程来解决问题。

在存储过程中看到的逻辑如下。

  • 将我要插入的完整信息传递给存储过程
  • 存储过程执行所有后端过程,例如验证和排列数据。
  • 将所有数据插入另一个临时表,其中表架构与我们的表相同。
  • 截断现有表并将所有数据从临时表复制到实际表。

上述过程比插入的仪式过程要快得多。

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 2011-08-09
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多