2009-05-19 58 views
1

我目前使用的Java EE注入我的EntityManager到一個web應用程序如下:如何管理java ee事務?

@PersistenceContext 
EntityManager em; 

@Resource 
UserTransaction utx; 

我有這樣的請求範圍JSF豆。它的工作原理,但它是一個痛苦,因爲避免了NoTransactionException我必須包裝每個DAO方法,像這樣:

public void saveSomething(Obj toSave) { 
    EntityManager em = getEntityManager(); 
    UserTransaction utx = getTransaction(); 

    try { 

     utx.begin(); 

     em.persist(toSave); 
     utx.commit(); 

    } catch(Exception e) { 
     logger.error("Error saving",e); 
     try { 
      utx.rollback(); 
     } catch(Exception ne) { 
      logger.error("Error saving",ne); 
     } 
     return null; 
    } 
} 

}

有什麼辦法有容器管理事務,我在一個項目像這樣只包含一個WAR文件?

回答

3

如果您正在管理自己的交易,最好的辦法是提供一個抽象的DAO做樣板代碼爲您提供:

@PersistenceContext 
EntityManager em; 

@Resource 
UserTransaction utx; 

abstract class AbstractDao<E,ID> implements IDAO<E,ID> { 

    public ID save(E e) { 
     try { 
       utx.begin(); 
       em.persist(e); 
       utx.commit(); 

     } catch(Exception e) { 
       logger.error("Error saving",e); 
       try { 
         utx.rollback(); 
       } catch(Exception ne) { 
         logger.error("Error saving",ne); 
       } 
       return null; 
     } 
    } 

} 

另一種方法是使用容器管理事務。請參考J2EE指南:http://java.sun.com/javaee/5/docs/tutorial/doc/bncij.html