Jakarta ee 在JavaEE无状态会话bean中,为什么SessionContext负责回滚事务,而不是EntityManager?
对于我(JavaEE开发新手),我认为容器管理的EntityManager负责回滚失败的事务,而不是SessionContext实例。假设以下场景Jakarta ee 在JavaEE无状态会话bean中,为什么SessionContext负责回滚事务,而不是EntityManager?,jakarta-ee,jboss,hibernate-entitymanager,Jakarta Ee,Jboss,Hibernate Entitymanager,对于我(JavaEE开发新手),我认为容器管理的EntityManager负责回滚失败的事务,而不是SessionContext实例。假设以下场景 @Stateless public class MySessionBean implements MySessionBeanRemoteInterface { @PersistenceContext(unitName="MYPu") private EntityManager em; @Resource privat
@Stateless
public class MySessionBean implements MySessionBeanRemoteInterface {
@PersistenceContext(unitName="MYPu")
private EntityManager em;
@Resource
private SessionContext sctx;
@Override
public StackOverFlowUser createSOUser(String userName, int rep) {
try {
StackOverFlowUser su = new StackOverFlowUser();
su.setUserName(stackOverflowName);
su.setRep(rep);
su.setIsBalusC(userName.equals("BalusC");
su.setIsTheJonSkeet(userName.equals("jon skeet"));
return em.merge(su);
} catch (Exception e) {
//sctx.setRollbackOnly();
return null;
}
}
}
为什么实体经理不对此负责?为什么要使用SessionContext?因为您告诉容器通过JTA(
transaction type=“JTA”
)管理事务,而不是JPA(transaction type=“RESOURCE\u LOCAL”
)。JTA反过来由EJB容器管理。因此,SessionContext
的角色就出现在这里
但让我烦恼的是,您正在抑制异常并返回null
。在业务服务方法中最好不要这样做。您最好让异常消失,而不是返回null
。EJB容器在任何异常情况下都会自动执行回滚。去掉EJB中的try-catch
和returnnull
,让EJB的客户机自己处理异常
例如
试试看{
CreateSourser(用户名,代表);
}捕获(持久异常e){
showSomeGlobalErrorMessage(如getMessage());
}
或者,更好的是,让它进一步进入底层容器。例如,如果它实际上是一个servlet容器:
javax.persistence.PersistenceException
/WEB-INF/errorpages/db-fail.xhtml
或者MVC框架甚至有一个可定制的全局异常处理程序。至少,JSF允许这样的机会,您可以全局设置faces消息,而无需在调用服务方法的托管bean方法的所有地方重复try-catch
另见:
抛出
,也不必自己抛出异常。当查询返回异常结果时,JPA将执行此操作。除非JPA没有根据您的业务需求抛出异常。当然,您可以随意抛出自定义异常,只要它带有注释。EJB随后也将透明地执行回滚。