私はmysqlとhibernate 4とc3p0でジャージーを使用しています。休止状態を構成し、現在のセッション コンテキスト クラスをスレッドに設定する初期化サーブレットを作成しました。セッションを取得およびコミットするための静的メソッドを含む hibernateUtils クラスを作成しました。フィルターを使用して、受信要求でセッションを開始し、応答時にコミットします。
問題は、いくつかのランダムな間隔で org.hibernate.TransactionException: nested transactions not supported 例外が発生することですが、フィルターを除いて新しいセッションを作成しようとはしていません。
間違っている場合は訂正してください。ただし、現在のセッション クラスをスレッドに設定する場合、hibernateutil でスレッドローカルを作成する必要はありません。hibernate がこれを行います。だから私の質問は、これはそれを処理する安全な方法ですか?ランダムな間隔でエラーが発生する原因は何ですか?
====================== 編集 =========================
以前にコードを投稿しなかったことをお詫び申し上げます。したがって、フィルタは ContainerRequestFilter,ContainerResponseFilter を実装します
私がやっているリクエストフィルターで
Session session = sessionfactory.getCurrentSession();
session.getTransaction().begin();
session.setDefaultReadOnly(readOnly);
そして応答で
Transaction transaction = sessionfactory.getCurrentSession().getTransaction();
try {
if (transaction != null && !transaction.wasCommitted()
&& !transaction.wasRolledBack() && transaction.isActive()) {
transaction.commit();
}
} catch (HibernateException e) {
Transaction transaction = sessionfactory.getCurrentSession().getTransaction();
try {
if (transaction != null && transaction.isActive()) {
transaction.rollback();
}
} catch (HibernateException e) {
} finally {
Session session = sessionfactory.getCurrentSession();
try {
if (session != null && session.isOpen()) {
session.close();
}
} catch (HibernateException e) {
log.error("Closing session after rollback error: ", e);
throw e;
}
}