首页 > 解决方案 > 在休眠中批量插入

问题描述

我正在尝试在数据库表中上传一个 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(发生异常后不刷新会话)异常。请帮助批量上传。

标签: javahibernatespring-boot

解决方案


为此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();

推荐阅读