如何管理java ee交易?

时间:2009-05-19 16:25:18

标签: java jpa java-ee

我目前正在使用Java EE将我的EntityManager注入Web应用程序,如下所示:

@PersistenceContext
EntityManager em;

@Resource
UserTransaction utx;

我在请求作用域的JSF bean中有这个。它有效,但这很痛苦,因为要避免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文件的项目中为我管理事务?

1 个答案:

答案 0 :(得分: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