2012-12-11 27 views
0

我對JavaEE/JPA相當陌生,並且在我的項目中滿足了以下需求,這是我一直在尋找如何實現的需求,但迄今爲止尚未取得成功,所以我希望你們中的任何一位都能指出我的錯誤,希望能告訴我正確的解決方案是如何工作的,對我來說學習而不是僅僅複製一段工作代碼。來自EJB的事務控制

問題:

在我的豆,我有一個方法調用3種diferent JPA持久的方法(1堅持和2合併),但我保證,如果一個或多個的這些執着的方法失敗,我可以回滾整個交易,以避免進一步的問題。

那是什麼我的豆看起來像一個從頭開始:

@Stateless(mappedName = "FuncionarioBean") 
@Remote(FuncionarioBeanRemote.class) 
@TransactionManagement(TransactionManagementType.BEAN)//Was instructed to put this annotation, but I don't know the real impact of it in my application if it was set as a CONTAINER. 
public class FuncionarioBean implements FuncionarioBeanRemote { 

    @PersistenceContext 
    private EntityManager em; 

    @Resource 
    private UserTransaction utx; 

    @Override 
    public void updateFuncionario(FuncionarioEntity funcionarioEditado) { 

     try{ 
      utx.begin(); 
      /* irrelevant code */ 
      callJPAMergeMethod1(); 
      /* irrelevant code */ 
      callJPAMergeMethod2(); 
      /* irrelevant code */ 
      callJPACreateMethod1(); 
      /* irrelevant code */ 
      utx.commit(); 
     } catch (Exception e) { 
      utx.rollback(); 
     } 
    } 
} 

我設置要更新的內容之一/合併爲空(列是NOT NULL),以確保會有例外,但由於某些未知的原因(至少對我而言),沒有任何例外,並且其他方法一直在執行。如果我刪除UserTransaction方法並刪除註釋,則會拋出異常,但我無法回滾整個方法。

你們能告訴我我在做什麼錯嗎?

在此先感謝您的幫助。

最好的問候,

恩里科貝加莫。

回答

0

@TransactionManagement對此不需要。

容器將回滾時:

  • 系統異常
  • (UN)檢查與@ApplicationException

拋出前提是你的EE容器能夠註解的異常。由於例如NullPointerException是一個未經檢查的異常,非系統異常,此處不提供回滾。

0

無需使用UserTransaction@TransactionManagement註釋,也不需要拋出任何例外。

您描述的行爲是默認的JPA行爲。如果一個或多個操作在事務提交時失敗,則整個事務(即數據庫事務中執行的所有操作)將被回滾。回滾由JPA提供程序自動執行,因此您不必「手動」執行任何操作。

然而,您應該注意一件事 - 如果您要在方法中管理JPA關係 - 即清空引用等,則需要恢復它們或在事務回滾時重新加載實體。