大量插入休眠

时间:2018-08-28 18:51:39

标签: java hibernate spring-boot

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

--as-parquetfile

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

2 个答案:

答案 0 :(得分:0)

为此,即使某些记录失败,也应使用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();

答案 1 :(得分:0)

休眠发生后,Hibernate不允许刷新会话(您应该在堆栈跟踪中看到消息don't flush the Session after an exception occurs),所以一种继续进行的方式可能是:

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

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