2

generic-dao ( http://code.google.com/p/hibernate-generic-dao/ )を使用しようとしています。ただし、私の HibernateBaseDAO では、getSession() メソッドは sessionFactory.getCurrentSession() として実装されています。これにより、エンティティの更新でエラーが発生します

org.hibernate.HibernateException: createCriteria is not valid without active transaction

ただし、getCurrentSession() の代わりに openSession() を使用すると、機能します。pom.xml の依存関係として spring を使用していません。私は openSession() と getCurrentSession() を読んできましたが、なぜこれが起こっているのか理解できませんか?

4

2 に答える 2

0

多くのcurrentSession状況で非常に壊れやすいことが判明しました。

エラー後に未定義の状態になる可能性があるため、「現在のセッション」とトランザクションが以前のエラーによって破棄されていないことを確認してください。これを実現するには、DAO 内でisActive呼び出しを使用する直前にトランザクション状態 ( ) を出力します。getCurrentSession

が設定され、機能していることを再確認してくださいSessionContext。2 回呼び出しgetCurrentSessionて、返されたインスタンスが同じかどうかを確認します。そうでない場合は、別のセッションを見ている可能性があります。

assert getCurrentSession()==getCurrentSession()

私は、Hibernate を非常に保守的にするという難しい教訓を学びました。したがって、基本に時間を費やすことは本当に報われます。

于 2013-05-22T17:57:21.150 に答える
0

解決策が見つかりました。genericDAO を使用すると、openSession() を使用して明示的に開く必要がある現在のセッションが取得されますが、getCurrentSession() はそれを現在のセッションにアタッチするだけです。著者によると

GenericDAO は、DAO の外部でトランザクションを処理することを想定しています。

于 2013-05-30T13:50:27.580 に答える