2017-10-11 15 views
0

私は、Hibernate - > MySQLを使用してJava-Webアプリケーションを開発しています。ネストされたトランザクション同期メソッドとエラー処理の例外の例外

ユーザはJSPページを見ると、コントローラを呼び出してDBからデータを取得します。また、ajaxを介してより大きなデータ文字列を取り出すJavascript機能も備えています。

問題: ユーザーがページをロードした後、ページ右側をリフレッシュすると、Ajaxのデータを担当するサーブレットは、この例外をスロー: org.hibernate.TransactionException:ネストされたトランザクションは

をサポートしていない、私は信じていますこれは最初の呼び出しからのトランザクションによって引き起こされます。これは、ユーザーが更新して2番目の呼び出しが実行されたときにはまだアクティブです。

私は、休止状態の相互作用を持つすべてのコントローラメソッドにと同期してとマークしました。 ユーザーは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; 
} 

は、私が見didntのミスはありますか? ここで何が問題になりますか?

答えて

0

コントローラで休止状態セッションを開くことは、休止状態の適切な実装ではありません。休止状態のセッションをサービスレイヤーまたはそれ以上のデータアクセスレイヤーに分離する必要があります。このコントローラーを呼び出してJSPを開き、休止状態のセッションを開きます。次に、あなたのajaxリクエストは同じコントローラを呼び出し、追加の休止状態のセッションを開こうとしますが、すでにオープンしているので、入れ子にされたトランザクション例外が発生します。これは、コントローラに休止状態のセッションロジックを残しておけば、常に発生します。アプリケーションの設計を再考する必要があります。

+0

おかげさまで、ありがとうございました! – user2312386

関連する問題