2011-11-16 131 views
2

我使用EntityManager將數據庫和Hibernate中的實體保存/更新爲jpa提供程序。我的交易由集裝箱處理。jpa併發CMT異常處理

問題:我需要添加一個實體,它可能已經存儲在數據庫中,所以會拋出異常。在這種情況下,我需要重複插入,但有另一個值。但只要發生異常,會話就會變壞,我需要創建一個新會話並回滾事務。我在使用CMT時如何做到這一點?或者如果有另一種方式來做到這一點?

謝謝。

回答

1

您可以使用TransactionAttribute(REQUIRES_NEW)作爲持久性方法。如果調用方法的bean會捕獲異常,它可能會做一些更改並再次調用該方法。
這將只回滾持久性方法事務 - 不是調用bean事務。

但是,請記住,如果您的使用案例不需要您執行EntityManager#persistence(-),那麼您可能會對EntityManager#merge(-)操作感興趣。它會堅持該實體,如果它不存在或更新它如果它已經存在(存在檢查基於PK)。

HTH。

0

您可能想要使用EntityManager#find(Class,PK)來檢查一個已經存在的實體。空結果表示沒有這樣的實體(----> persist(。)),否則使用merge(。)方法更新。

+0

是的,我知道。我想創建一個系統,在一個問題中描述在這個網站上(現在找不到鏈接):數據庫確保使用唯一約束來增加值是唯一的。我必須在這裏強調我們必須處理併發請求,並試圖避免同步我的插入方法。使用適當的異常處理,我們可以確保每次添加唯一的值。這首先是我想要的。 – Alberto