How to manage java ee transactions?
I am currently using Java EE to inject my EntityManager into a web application like this:
@PersistenceContext
EntityManager em;
@Resource
UserTransaction utx;
I have this in a JSF scoped bean request. It works, but it's a pain because to avoid the NoTransactionException I have to wrap each DAO method like this:
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;
}
}
}
Is there a way for a container to manage transactions for me on a project like this that consisted of only a WAR file?
+1
a source to share
1 answer
If you manage your own transactions, the best way is to provide an abstract DAO to generate template code for you:
@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;
}
}
}
An alternative is to use container-managed transactions. Please refer to the J2EE tutorial: http://java.sun.com/javaee/5/docs/tutorial/doc/bncij.html
+3
a source to share