Как управлять транзакциями Java EEE? - PullRequest
1 голос
/ 19 мая 2009

В настоящее время я использую Java EE для добавления моего EntityManager в веб-приложение следующим образом:

@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 Ответ

3 голосов
/ 21 мая 2009

Если вы управляете своими собственными транзакциями, лучшим способом является предоставление абстрактного 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...