2012-06-09 90 views
16

如何在非ejb應用程序中使用以下代碼。代碼起作用。JTA EntityManager不能使用getTransaction()

@Override 
public void saveItems(Collection<T> items) { 
    synchronized (em) { 
     EntityTransaction tx = em.getTransaction(); 
     try { 
      tx.begin(); 
      for (T item : items) { 
       saveItem_((Class<T>) null, item); 
      } 
      tx.commit(); 
     } finally { 
      if (tx.isActive()) { 
       tx.rollback(); 
      } 
     } 
    } 
} 

在新的應用程序中,我使用EJB3 + JSF並希望重新使用包含上述代碼的庫。新應用程序我peristence單元看起來是這樣的:

<persistence-unit name="myApp" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>MySQLConnection</jta-data-source> 
    </persistence-unit> 

我的新的應用程序拋出一個異常,當它擊中這一行:

EntityTransaction tx = em.getTransaction(); 

的例外是:

A JTA EntityManager cannot use getTransaction() 

哪個足夠清楚。問題是如何將我的代碼轉換爲由容器管理的事務。據推測,我的bean方法需要適當的註釋...問題是如何?

回答

12

EntityTransaction與類型爲resource local的實體管理器一起使用。如果你想使用JTA,那麼必須使用UserTransaction接口。

來自文檔:EntityTransaction - 用於控制資源本地實體管理器上事務的接口。 EntityManager.getTransaction()方法返回EntityTransaction接口。


編輯:加入的僞代碼。

@Resource 
private SessionContext sessionContext; 

void execute(){ 

UserTransaction userTxn = sessionContext.getUserTransaction(); 

try{ 

userTxn.begin(); 
/** 
    * do-something 
    */ 
userTxn.commit(); 

    } catch(Throwable e){ 
    userTxn.rollback(); //-- Include this in try-catch 
    } 
} 
+3

那麼這裏有什麼解決方案? – rtcarlson

+0

@rtcarlson爲什麼downvoted&我沒有清除我的帖子使用'UserTransaction'界面。 –

+0

@downvoter如果你無法解釋和理解,請不要無故倒戈。 –

4

在最簡單的情況下 - 它只是起作用。如果您將EntityManager注入到EJB中並且不使用特殊註釋,則事務將在輸入的第一個EJB方法中打開(這意味着如果EjbA調用EjbB並調用EjbC,則只有一個事務將用於所有EJB方法)。如果您想修改事務的控制方式,請查看@Transaction。

做回滾最簡單的方法是拋出標有@ApplicationException異常(回滾=真)

我可能是錯的,但是從你的代碼來看,你應該上延伸和法線之間的差異讀了EntityManager的。看起來你正在以一種非常尷尬的方式使用擴展的EM(將循環移出事務將最終幫助你擺脫困境)。因爲一個標準的EntityManager(你可能正在使用)使用所謂的CMT(容器管理事務),所以如果你嘗試使用UserTransaction,就會出現一個錯誤。不要去碰它,除非你瞭解三個基本opositions(如果你願意,我可以詳細說明,但坦率地說,你不會需要它):

  • 容器管理的EntityManager與應用程序管理的EntityManager,
  • 容器管理事務與應用程序管理事務,
  • NORMAL EntityManager和EXTENDED EntityManager。
相關問題