2009-05-19 113 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