java - 如何管理java ee事务?

标签 java jpa jakarta-ee

我目前正在使用 Java EE 将 EntityManager 注入(inject)到 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 文件的项目中为我管理事务吗?

最佳答案

如果您管理自己的事务,最好的方法是提供一个抽象的 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

关于java - 如何管理java ee事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/883778/

相关文章:

java - 毫无意义地使用 PrintStream?

java - JPA事务的超时实现和Session失效

java - Hibernate 谓词 - 无效路径

Java EE单例计划任务执行两次

java - 为maven生成jar

java - Thread.currentThread().getContextClassLoader().getResourceAsStream 多次读取属性文件

java - Android:向位图添加填充

mysql - 尝试从父表中删除时出现 SQLIntegrityConstraintViolationException(使用 Java Spring 和 MySQL)

java - Mojarra 中的高 session 内存使用率

java - 轴2休息: POST Parameters Null