当前位置: 首页 > 知识库问答 >
问题:

Hibernate状态下的批量插入

邹宣
2023-03-14

我正在尝试在数据库表中上传Excel表。我正在将excel行转换为Hibernate实体并尝试将其保存在数据库中。为了实现这一点,我面临着问题。很少有db约束,如唯一或复合键等,但用户可以上传任何表。所以如果一个网格行无法插入,那么我的要求是其他行应该继续。和事务应该被保存。

`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(发生异常后不要刷新会话)异常。请帮助批量上传。

共有2个答案

明安阳
2023-03-14

Hibernate不允许在发生异常后刷新会话(您应该看到消息在stacktrac中发生异常后不刷新会话),因此继续的方法可以是:

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

    < li >如果一切正常,只需提交并继续下一个块。 < li >如果出现错误,回滚事务并重新启动块,但将失败块的每个元素保存在专用事务中
周飞语
2023-03-14

为此,您应该使用< code>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();
 类似资料:
  • 问题内容: 我正在使用hibernate+播放!框架在工作中,是否有使用“hibernate”插入大量记录的“最佳实践”?每个文本文件大约有6,000到10,000个,所以我不知道Hibernate是否会扼杀工作或引发异常。 任何建议都让我知道,如果需要进一步说明,请告诉我 问题答案: 在* Java Persistence and Hibernate(Manning)中,并在Pangea的评论之

  • 问题内容: 给定训练有素的LSTM模型,我想对单个时间步执行推断,即在下面的示例中。在每个时间步之后,需要记住下一个“批”的内部LSTM状态(内存和隐藏状态)。对于推论的最开始,在给定输入的情况下计算内部LSTM状态。然后将它们存储在传递给LSTM的对象中。在训练期间,此状态会在每个时间步更新。但是,为了进行推断,我希望在批处理之间保存初始状态,即,仅需在最开始时计算初始状态,然后在每次“批处理”

  • 问题内容: 我需要从每日CSV文件中消耗大量数据。CSV包含约12万条记录。使用hibernate模式时,这会减慢爬行速度。基本上,当使用saveOrUpdate()时,hibernate似乎在每个单独的INSERT(或UPDATE)之前执行SELECT。对于使用saveOrUpdate()持久存储的每个实例,在实际的INSERT或UPDATE之前发出SELECT。我能理解为什么要这样做,但是在进

  • 出于不需要透露的原因,我需要使用hibernate层运行一系列本机SQL语句。它们是相同的语句(相同的绑定变量),形式为“插入abc(column1,column2)值(:Column1List,:Column2List)”。

  • 问题内容: 使用hibernate时,当我尝试使用以下方式启用批量插入时 我得到以下输出: 然后这个: 基本上没有。 我是否缺少设置? 问题答案: 原来在这种情况下缺少的是: 现在我明白了 频繁得多(任何大于1的值基本上都意味着它成功完成了批量插入)。 hibernate.jdbc.batch_versioned_data也可能有用。 jdbc:mysql:// localhost:3306 /

  • 问题内容: 我有5个MySQL InnoDB表:每个表都在Hibernate中映射并起作用。我玩过使用StatelessSession / Session和JDBC批处理大小。我删除了任何生成器类,以使MySQL处理id生成- 但它的执行速度仍然很慢。这些表中的每一个都在java类中表示,并相应地在hibernate中进行映射。目前,当需要将数据写出时,我遍历对象并执行一个(如果正在使用State