2012-06-01 27 views
0

我的對象:http://pastebin.com/FWEGwcL0獨特的情侶值+ Hibernate和批量插入的

我需要防止對夫婦加行(名稱;姓)已經存在。 I.e .:我可以添加(約翰;布朗),(約翰;白色),(路易絲;布朗),但我應該防止添加另一個(約翰;布朗)。

當我保存對象時,我會保存一個List。 這意味着如果我把鍵放在DB上讓這對夫婦(名字,姓氏)是唯一的,恐怕當我保存對象列表時,如果一個失敗,所有其他值也失敗。

我該如何預防?

非常感謝!

回答

0

不幸的是,如果您有連接的實例,JPA中的異常是不可恢復的。

從規格:

3.3.2事務回滾對於這兩個事務範圍和擴展持久化上下文,事務回滾導致所有預先存在的 託管實例併除去實例[31],以變得脫離。 實例的狀態將成爲事務被回滾的地點 處的實例狀態。事務回滾通常爲 導致持久化上下文在回滾點 處於不一致狀態。特別地,版本屬性和生成狀態(例如,生成的主鍵)的狀態可能不一致。 以前由持久性上下文 管理的實例(包括在該事務中持久化的新實例)因此可能無法以與其他 分離對象相同的方式重用 - 例如,傳遞到合併時可能會失敗 操作。[32]

這意味着一旦遇到異常,就不能將該會話用於任何進一步的數據庫操作。

這意味着你將不得不創建一個新的會話,然後再次開始你的交易。

與Hibernate一樣,如果您直接使用hibernate API來管理您的事務。

12.2.3。異常處理如果Session引發異常(包括任何SQLException),立即回滾數據庫事務,請調用Session.close()並放棄Session實例。 會話的某些方法不會使會話保持一致的 狀態。 Hibernate引發的異常可以視爲可恢復。 確保通過在finally 塊中調用close()來關閉會話。處理這種

的一種方法是,你不使用管理的情況下,而不是你用超脫的情況下,你會在每次數據庫操作後關閉會話或EntityManager的無論成功或失敗的話。

在這種情況下,一旦關閉了會話,您的對象就會分離,並且進一步的異常不會對它們產生任何影響。

跨越一個不錯article

+0

什麼saveOrUpdate方法來的?我可以讓它明白,對於存在的夫婦(名字,姓氏)應該使用更新功能,而不是保存一個? – Bagbyte

+0

當你調用保存時,它會嘗試插入,當你調用saveOrUpdate時它會爲你做詭計,如果記錄不存在,它將插入一條新記錄,否則它將更新現有記錄 – mprabhat