嵌套事务虽然同步方法和错误处理异常

问题描述:

我正在开发一个使用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会话逻辑留在控制器中,这将始终发生。你应该重新考虑你的应用程序的设计。

+0

感谢您的建议,请看看那个! – user2312386