我目前正在使用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文件的项目中为我管理事务?
答案 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