【问题标题】:bulk insert in hibernate在休眠中批量插入
【发布时间】:2018-08-28 18:51:39
【问题描述】:

我正在尝试在数据库表中上传 Excel 工作表。我正在将 excel 行转换为休眠实体并尝试将其保存在数据库中。为了实现这一点,我面临着问题。数据库约束很少,例如唯一键或复合键等,但用户可以上传任何工作表。因此,如果无法插入特定行,那么我的要求是应该继续其他行。并且交易应该被保存。

`Session session=localSessionFactoryBean.getObject().openSession();
        Transaction tx = session.beginTransaction();
fot(i=0;i<list.size();i++){
Long Id = (Long) session.save(list.get(i));
if (i % 50 == 0) {
                    session.flush();
                    session.clear();
                }
}
tx.commit();
session.close();

` 在这里,如果单行失败,则所有行都失败。我正进入(状态 org.hibernate.AssertionFailure: null id(异常发生后不刷新Session)异常。请帮忙批量上传。

【问题讨论】:

    标签: java hibernate spring-boot


    【解决方案1】:

    为此,您应该使用try-catch 构造来继续插入记录,即使其中一些记录失败:

    Session session=localSessionFactoryBean.getObject().openSession();
    Transaction tx = session.beginTransaction();
    for(i=0;i<list.size();i++){
      try{
        Long Id = (Long) session.save(list.get(i));
      } catch(Exception e){
        //nop  
      }
      if (i % 50 == 0) {
         session.flush();
         session.clear();
         tx.commit();      
      }
    }
    tx.commit();
    session.close();
    

    【讨论】:

    • 不,它不工作的块有异常失败
    • 异常发生后不要刷新Session
    • @ER.k.mukherjee 立即尝试。
    • 没有不工作,同时保持 tx.commit();并且 session.flush(0 之外的 try catch 将向父方法抛出异常并且循环将被破坏
    【解决方案2】:

    Hibernate 不允许在发生异常后刷新会话(您应该在堆栈跟踪中看到消息 don't flush the Session after an exception occurs),因此可以采取以下方法:

    将您的 list 分成 50 个元素的块,并尝试将每个块保存在单个事务中:

    • 如果一切顺利,只需提交并继续下一个块。
    • 如果发生错误,回滚事务并重新启动块,但 将失败块的每个元素保存在专用事务中

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2015-09-08
      • 2012-11-18
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多