Spring と Hibernate を使用してデスクトップ アプリケーションを開発していますが、遅延開始に問題があります。Web を調べたところ、すべての解決策が open session in view パターンに関連していますが、このパターンは使用できません。sessionfactory
からも取得しようとしましHibernateTemplate
たが、切断されたセッションが返されます。
他の解決策を知っている人はいますか?
Spring と Hibernate を使用してデスクトップ アプリケーションを開発していますが、遅延開始に問題があります。Web を調べたところ、すべての解決策が open session in view パターンに関連していますが、このパターンは使用できません。sessionfactory
からも取得しようとしましHibernateTemplate
たが、切断されたセッションが返されます。
他の解決策を知っている人はいますか?
基本的に2つの解決策があることをお勧めします。
遅延初期化されたオブジェクトまたはコレクションにアクセスするときは、Hibernate セッションを開いたままにしておくように手配してください。つまり、「ビューでセッションを開く」パターンのように、コード内でトランザクション境界を注意深くマークする必要があります。Spring はこれを可能にしますが、デスクトップ アプリケーションでは、トランザクション境界がもう少し明白な Web アプリケーションほど単純ではありません。
Hibernate で永続化されたオブジェクトの遅延初期化をすべてオフにします。
オプション 2 は、多くの不要なデータベース アクセスにつながる可能性があり、オプション 1 は、ワークフローとユース ケースを真剣に検討する必要があることを意味します。
それが役立つことを願っています!
私は非常によく似た問題を抱えていましたが、それに対する本当に適切な解決策を見つけることができなかったためです。私は、ウェブ上にある多くの異なるアプローチを組み合わせた独自のアプローチを考え出し、それらをブログに投稿しました。
申し訳ありませんが、ここにすべてを記載していませんが、これまたは同様の問題を抱えている人々を見つけたすべてのフォーラムで何度も何度もそれを行うのは大変な作業です
1 つのオプションは、エンティティまたはコレクションで Hibernate.initialize() を呼び出して強制的に初期化することです。データをビューに戻す前に、これを行う必要があります。データベースに対して大量の SQL ステートメントが生成されるため、これについては慎重に検討します。
HQL クエリで「fetch」を使用するか、マッピングでフェッチ モードを「eager」に設定することを検討することをお勧めします (JPA の FetchMode.EAGER または hbm.xml の lazy="false" だと思います)。
@Jose: 自分の ThreadLocal でセッションを管理しないでください。SessionFactory.getCurrentSession() を使用し、「スレッド」SessionContext を使用するように Hibernate を構成します。