嵌套事务虽然同步方法和错误处理异常
问题描述:
我正在开发一个使用Hibernate - > MySQL的Java-Web应用程序。嵌套事务虽然同步方法和错误处理异常
用户看到一个JSP页面,它调用控制器从数据库获取数据,并且它具有一个Javascript函数,通过ajax获取更大的数据字符串。
问题: 当用户加载页面后立即刷新页面,负责AJAX数据的servlet抛出此异常: org.hibernate.TransactionException:嵌套事务不支持
我相信这是由第一次调用导致的,当用户刷新并执行第二次调用时,该事务仍处于活动状态。
我标记每个控制器与休眠互动的方法为同步。 现在用户能够刷新1-5次,但是异常仍然发生。
我使用Hibernate 4.3.1。 HibernateUtil.openSession()只是sessionFactory.getCurrentSession();
这是发生异常控制器 - 摘录:
public static synchronized Widget getWidgetById(long id) {
Widget result;
Session session = HibernateUtil.openSession();
try {
Transaction tx = session.beginTransaction();
try {
result = (Widget) session.get(Widget.class, id);
tx.commit();
} catch (Exception ex) {
tx.rollback();
throw ex;
}
} finally {
//disabled since we use transaction.auto_close_session
//session.close();
}
return result;
}
有没有,我没有看到任何错误? 这里有什么问题?
答
在控制器中打开一个hibernate会话不适用于hibernate。你应该将你的休眠会话分成一个服务层,甚至是一个数据访问层。你调用这个控制器来打开JSP,它打开一个hibernate会话。然后你的ajax请求调用同一个控制器并尝试打开一个额外的hibernate会话,但你已经打开了一个,因此给你嵌套的事务异常。如果您将hibernate会话逻辑留在控制器中,这将始终发生。你应该重新考虑你的应用程序的设计。
感谢您的建议,请看看那个! – user2312386