2017-10-11 67 views
0

我正在開發一個使用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; 
} 

有沒有,我沒有看到任何錯誤? 這裏有什麼問題?

回答

0

在控制器中打開一個hibernate會話不適用於hibernate。你應該將你的休眠會話分成一個服務層,甚至是一個數據訪問層。你調用這個控制器來打開JSP,它打開一個hibernate會話。然後你的ajax請求調用同一個控制器並嘗試打開一個額外的hibernate會話,但你已經打開了一個,因此給你嵌套的事務異常。如果您將hibernate會話邏輯留在控制器中,這將始終發生。你應該重新考慮你的應用程序的設計。

+0

感謝您的建議,請看看那個! – user2312386