我在@ManagedBean
类中使用Bean管理的事务来手动管理事务,
@ManagedBean(name = "clients")
@ViewScoped
@URLMapping(id = "sousc", pattern = "/ccf_sicavs_customers", viewId = "/customers/PgSouscripteurs.jsf")
@TransactionManagement(TransactionManagementType.BEAN)
public class SouscripteursBean extends Referentiel implements Serializable {
@Resource
private UserTransaction ut;
@EJB
private CustomerDaoLocal ejbCust;
public void createCustomer() {
try {
LOGGER.info("Debut de la transaction");
ut.begin();
LOGGER.info("begin() succeded");
currentMorale.setCodeSouscripteur("25");
saved=ejbCust.createCustomer(currentMorale);
ut.commit();
LOGGER.info("commit() succeded");
} catch (Exception e) {
saved=false;
try {
ut.rollback();
LOGGER.info("rollback() succeded");
} catch (Exception ex) {
LOGGER.log(Level.SEVERE,null,ex);
}
}
}
}
但如果在exception
之前抛出commit()
,则rollback()
失败
抛出这个java.lang.IllegalStateException
:
SEVERE: java.lang.IllegalStateException: Transaction is not active in the current thread.
at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.validateTransactionManager(JavaEETransactionManagerJTSDelegate.java:447)
at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.rollbackDistributedTransaction(JavaEETransactionManagerJTSDelegate.java:208)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.rollback(JavaEETransactionManagerSimplified.java:899)
at com.sun.enterprise.transaction.UserTransactionImpl.rollback(UserTransactionImpl.java:234)
答案 0 :(得分:2)
我认为你有这个例外,因为事务在EJB容器范围之外。 JSF应用程序是EJB服务客户端,应用程序位于WEB容器范围内。
通常,您不在JSF托管bean中执行任何业务逻辑。托管bean只是JSF ModelViewController体系结构中的控制器。业务逻辑应该在ejb中完成,并将它们注入JSF托管bean中,并且只使用该功能调用EJB方法。事务,持久性,安全性等应该在EJB内部完成。
从底线开始,事务应该在该EJB内部的createCustomer()方法内完成,而不是在托管bean中完成。
试试吧!