2

通常、Spring + Atomikos を使用して JTA セッションを管理し、hibernate.auto_close_session を true に設定します。ここで、(非同期ジョブの) ステートレス セッションを次のように手動で開くとします。

StatelessSession sl = sessionFactory.openStatelessSession();

StatelessSession を閉じるにはどうすればよいですか? 電話したら

sl.close()

その後、「currentSession」がロールバックします。注釈を付ければ

@Transactional(propagation = Propagation.NOT_SUPPORTED)

StatelessSession を使用するメソッドでは、コミットがハングします。Atomikos ログは、新しいトランザクションを生成し続け、停止しないことを示しています。

完全なコード:

         public Vendor findByCode(String code) {

            StatelessSession slsession = null;
            Transaction tx = null;
            try {
                    slsession = getStatelessSession();
                    tx = slsession.beginTransaction();
                    return (Vendor) slsession.createQuery("from Vendor"
                                    + " where code = :code")
                                    .setParameter("code", code)
                                    .uniqueResult();
            } catch (HibernateException e) {
                    e.printStackTrace();
                    return null;
            } finally {
                    if (slsession != null && tx != null) {
                            tx.commit();
                            slsession.close();
                    }
            }
    }

Spring マネージド セッションが既に存在し、このメソッドが呼び出されました。

何が間違っているのか教えていただけますか?

4

1 に答える 1

0

非常に古い未回答の質問ですが、ここで何が答えになるでしょうか。トランザクションをロールバックする必要がありますが、セッションを閉じる必要はありません。あなたが本当にしたいのでなければ。

コードでこれを使用できないようにする注釈などのツールがありますが、これは次のようになります。

        tx.commit();
    } catch (HibernateException e) {
        tx.rollback();
        logger.error(e);
    } 
于 2015-12-13T23:43:37.440 に答える