1

私は休止状態と春を使用していますが、次のコードを実行するとこの例外が発生します:

Session oSession = getSession();
     try
     {
         oSession.setFlushMode(FlushMode.COMMIT);
         getHibernateTemplate().delete(oProject);
         oSession.flush();
         bResult = true;
     }
     catch (Exception e)
     {
         bResult = false;
         logger.error(e);
     }

休止状態に関するいくつかのセッション管理を読みましたが、このコードのセッション処理が不十分であるという予感があります。2 つのオープン セッションがある理由は何ですか? Hibernate API は、getSession()関数が新しいセッション オブジェクトまたは既存のいずれかを返すと述べています。この場合、既存のセッション オブジェクトはどこで取得されるのでしょうか。また、新しいセッション オブジェクトを作成する場合でも、関連するコレクションを処理しても問題ありませんか?

どんな助けでも大歓迎です。前もって感謝します!より多くのパワースタックオーバーフロー。

4

2 に答える 2

4

HibernateTemplate.delete(Object entity)内部で他のセッションを使用してオブジェクトを削除しますが、エラーの根本原因である独自HibernateTemplateの新しいオブジェクトを開きます。Sessionしたがって、次のように試してください。

 try
 {
     getHibernateTemplate().delete(oProject);
     bResult = true;
 }
 catch (Exception e)
 {
     bResult = false;
     logger.error(e);
 }
于 2012-05-07T10:20:39.480 に答える
0

Hibernate は、現在のスレッドに対してすでに開かれているセッションがあるかどうかを確認します。そうでない場合は、SessionFactory を使用して新しいものを作成します。それ以外の場合は、すでに開いているセッションを再利用します。エンティティ オブジェクトを再アタッチすることもできます。エンティティ オブジェクトを含むコレクションについても同じことが言えます。

しかし、セッションを処理するために Hibernate がどのように構成されているかについては言及していません。手動でセッションを開き、投稿したコードが実際に 2 つのセッションを開く可能性があります。

于 2012-05-07T10:17:48.597 に答える