2012-10-30 35 views
5

我正在使用带有hibernate的jpa我想在数据库中插入100条记录,假设我在第50条记录插入中得到异常JDBC批量更新,我需要处理异常,并且需要保留其余记录到DB。如何在发生异常时继续批量插入

代码:

private List<TempCustomers> tempCustomer =new ArrayList<TempCustomers>(); 

    public String migrateCustomers() { 

     TempCustomers temp = null; 
     for(DoTempCustomers tempCustomers:doTempCustomers){ 

       try { 
       temp=new TempCustomers(); 
       BeanUtils.copyProperties(temp, tempCustomers); 
         tempCustomer.add(temp); 
        entityManager.persist(temp); 


       }catch (Exception e) { 
        tempCustomer.add(temp); 
        entityManager.persist(temp); 
        log.info("Exception ..."+e); 
        return "null"; 
       } 
     } 


     return "null"; 
    } 
+0

谢谢你的回应,假设从列表中读取100条记录,然后我将坚持使用entityManager.persist(temp)..在该列表中一条记录不正确,因此通过JDBC批处理异常休眠。时间扩展99条记录我想存储数据库,我该怎么办呢? – nag

+0

是的..拉斯,我需要捕捉异常和扩展持久。如何做到这一点? – nag

+1

千万不要这样做'log.info(“Exception ...”+ e);'...它吞下堆栈跟踪。相反,使用'log.info(“Exception ...”,e);'作为参数的例外 – artbristol

回答

0

Nagendra。

RAS先生讲的是正确的。

例如,您持续存在100个实体,并且在第50个实体持续存在异常。你有异常处理程序它会为你处理这种情况。它会跳过当前的并处理下一个。

事情打理如下:

1-你的异常处理应该是内环路,希望你已经拥有了它。

2-例外情况下,您可以将实体保存在不同的列表中以便进一步分析错误细节。在异常catch块中执行。

3-我不确定您是否使用事务管理器,事务需要小心。

-

+0

Rudra我如何实现第二种情况,通过上面的代码将tempCustomer列表添加到实体对象(temp)中,它会给出异常只有在entityManager.persist(temp)语句的时候,你可以为此制作示例代码吗? – nag

0

在第二种情况,请删除行...

entityManager.persist(临时);

因为您已经知道这会抛出异常。将其保留在列表中供您进一步分析。最好放入任何队列(ActiveMQ)直到你。

这个最好的解决办法又是:

验证所有数据之前坚持......到异常减少。运行时需要重新处理,这应该是手动的。

+0

作为警告,请勿使用链接到您网站的页脚,否则您的答案可能会被标记为垃圾邮件。 –