2015-03-30 84 views
-1

在行創建鎖使用MySQL和Hibernate 4.3.5Hibernate的重複條目例外在MySQL

我有一個主鍵091210Mortgage表中的一行。在使用休眠的Java應用程序中,當我(錯誤地)嘗試使用相同的密鑰保存抵押貸款時,將記錄正確的com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY'例外,並且不會拋出

問題:

此異常被拋出/登錄然而程序沒有完成,也沒有執行終止。此外,我注意到在原來的行上創建了一個更新/刪除鎖,導致了重複的異常。要恢復的唯一方法是如果我可以手動終止程序,然後該重要行不再是「鎖定」

  • 這是預期的,有沒有人經歷過這之前?
  • 這怎麼能從Java程序中恢復?

我希望這種異常會取消/中斷事務,然後拋出異常。但是,相反,似乎例外,只是記錄,鎖是在DB創建,過程似乎只是掛在transaction.commit() ...

代碼:

System.out.println("Begin transaction"); 
session.beginTransaction(); 

System.out.println("Save mortgage"); 
session.save(mortgage); 
System.out.println("Commit transaction"); 
session.getTransaction().commit(); 

System.out.println("Close session"); 
session.close(); 
System.out.println("Close SessionFactory"); 
HibernateUtil.getSessionFactory().close(); 

相關的輸出我看到:

Begin transaction 
Save mortgage 
Commit transaction 
Hibernate: insert into mortgage (address, last_name, inst_id, date, mortgage_num) values (?, ?, ?, ?, ?) 
Mar 30, 2015 7:59:54 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 

... Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY'

然後程序只是掛起,還是用紅光發光的運行,並在DB的鎖。

沒有try-catch,沒有記錄。這是來自Eclipse控制檯。

+0

我假設你捕捉到異常,然後將它寫入日誌文件。當你捕捉到它時,你是否會回滾休眠事務?因爲那應該修復鎖定。 – Ractoc 2015-03-30 21:48:19

+0

我的應用程序沒有做任何日誌記錄,也沒有'try-catch'。我將用我執行的代碼更新答案。 – mmcrae 2015-03-30 21:59:16

+0

好吧,如果我可以在15分鐘左右的時間內找到剩餘的空間,那麼明天我會在工作中再考慮一下。 – Ractoc 2015-03-30 22:07:59

回答

0

讓我把答案在這裏,所以我可以正確地格式化代碼...

在你的代碼,添加了一點錯誤處理:

try { 
    System.out.println("Begin transaction"); 
    session.beginTransaction(); 

    System.out.println("Save mortgage"); 
    session.save(mortgage); 
    System.out.println("Commit transaction"); 
    session.getTransaction().commit(); 

    System.out.println("Close session"); 
    session.close(); 
    System.out.println("Close SessionFactory"); 
    HibernateUtil.getSessionFactory().close(); 
} catch (HibernateException he) { 
    he.printStackTrace(); 
} 

這將打印整個堆棧跟蹤到你安慰。有更好的方式來記錄像這樣的東西,但不是這樣做會很好。當你最終陷入困境時,你可能也想做一個很好的事務回滾。但是,在我們解決您的更緊迫問題之後,可以進行那種清理。

如果您願意,我會在接下來的幾天內提供一個很好的教程。

+0

如上面Q中提到的那樣,沒有捕捉或任何例外。這就是爲什麼這很奇怪。沒有異常被拋出/被捕獲。該方案在那裏被吊死。我沒有任何catch語句,因此拋出的任何內容都應該終止程序。而來自hibernate的日誌並不是因爲我正在做任何日誌記錄,而是因爲Eclipse只是將hibernate自己的日誌記錄放到控制檯窗口中 – mmcrae 2015-10-07 20:53:25