Como gerenciar transações Java EE?

votos
1

Atualmente estou usando Java EE para injetar minha EntityManager em um aplicativo web como segue:

@PersistenceContext
EntityManager em;

@Resource
UserTransaction utx;

Eu tenho isso em um escopo de requisição JSF feijão. Ele funciona, mas é uma dor porque, para evitar o NoTransactionException eu tenho que envolva todos os métodos DAO assim:

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;
    }
}

}

Existe alguma maneira de ter o recipiente gerenciar as transações para mim em um projeto como este, consistindo apenas em um arquivo WAR?

Publicado 19/05/2009 em 17:25
fonte usuário
Em outras línguas...                            


1 respostas

votos
3

Se estiver a gerir as suas próprias operações, a melhor maneira é fornecer um DAO abstrato para fazer o código clichê para você:

@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;
        }
   }

}

A alternativa é usar transações gerenciadas por contêiner. Por favor, consultar o guia de J2EE: http://java.sun.com/javaee/5/docs/tutorial/doc/bncij.html

Respondeu 21/05/2009 em 12:06
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more