在批量插入中,如果在一行中发生错误时如何继续插入其他行 [英] In batch insert, how to continue inserting other rows when an error occurred in one row

查看:282
本文介绍了在批量插入中,如果在一行中发生错误时如何继续插入其他行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的代码中,我正在执行批量插入。例如,假设我有五行要插入,其中一个插入失败。然后休眠阻止插入所有行。

在我的情况下,我想插入其他四条不包含错误的记录。这在Hibernate中可能吗?

以下是我的代码的简化版本。

  void save(){
Session session1 = HibernateUtil.getSessionFactory()。openSession();
Transaction transaction = session1.beginTransaction();

for(int i = 0; i <5; i ++){
BatchSizeConf r = new BatchSizeConf(); //这是我的实体
r.setId(i );
r.setDispatchType(Disp);
r.setBatchSize(500);
Serializable z = session1.save(r);
System.out.println(z); //打印id
}

session1.flush();
session1.clear();
session1.getTransaction()。commit();
session1.close();
}

编辑



根据以下答案,我更改了我的代码并解决了我的主要问题。现在我的代码就是这样。

  void save(){
for(int i = 0; i< 5; i ++){
Session session1 = HibernateUtil.getSessionFactory()。openSession();
Transaction transaction = session1.beginTransaction();

BatchSizeConf r = new BatchSizeConf(); //这是我的实体
r.setId(i);
r.setDispatchType(Disp);
r.setBatchSize(500);

尝试{
session1.save(r);
transaction.commit();
} catch(HibernateException e){
System.out.println(Failed:+ i);
}

session1.flush();
session1.clear();
session1.close();
}
}

我现在还有两个问题。 >


  1. 创建多个会话对象可以吗? (我有超过100000条记录。)

  2. 我是否需要调用 flush() clear ) close()方法如上所述?


$ b $ pre $ Transaction tx = session.beginTransaction()

;
...
(BatchSizeConf b:BatchSizeConfList){
...
tx.commit();
}

请参阅 Avaoid事务异常


In my code I am doing a batch insert. For an example think that I have five rows to insert, and one of those fails when inserting. Then hibernate prevent inserting all the rows.
In my case I want to insert other four records which contains no errors. Is this possible in Hibernate?
Following is a simplified version of my code.

void save() {
  Session session1 = HibernateUtil.getSessionFactory().openSession();
  Transaction transaction = session1.beginTransaction();

  for (int i = 0; i < 5; i++) {
    BatchSizeConf r = new BatchSizeConf();//This is my entity
    r.setId(i);
    r.setDispatchType("Disp");
    r.setBatchSize(500);
    Serializable z = session1.save(r);
    System.out.println(z);//prints ids
  }

  session1.flush();
  session1.clear();
  session1.getTransaction().commit();
  session1.close();
}

EDIT:


According to following answers below I changed my code and solved my main problem. Now my code is like this.

void save() {
  for (int i = 0; i < 5; i++) {
    Session session1 = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = session1.beginTransaction();

    BatchSizeConf r = new BatchSizeConf();//This is my entity
    r.setId(i);
    r.setDispatchType("Disp");
    r.setBatchSize(500);

    try {
      session1.save(r);
      transaction.commit();
    } catch (HibernateException e) {
      System.out.println("Failed: " + i);
    }

    session1.flush();
    session1.clear();
    session1.close();
  }
}

I Now I have another two questions.

  1. Is it ok to create multiple session objects like above? (I have more than 100000 records.)
  2. Do I need to call flush(), clear() and close() methods as above?

解决方案

You can do something like this

Transaction tx = session.beginTransaction();
...
for (BatchSizeConf  b: BatchSizeConfList) {
    ...
    tx.commit();
}

Refer Avaoid transaction exception

这篇关于在批量插入中,如果在一行中发生错误时如何继续插入其他行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆