2012-10-30 36 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

作爲警告,請勿使用鏈接到您網站的頁腳,否則您的答案可能會被標記爲垃圾郵件。 –