0

Hibernate を使用していますが、アプリで LazyInitializationException に問題があります。この問題はSpringフレームワーク(いくつかの注釈、構成など)で簡単に解決できますが、私はこのフレームワークを知らず、今は学びたくありません(私は初心者です)。

この問題はかなり古いので、 OpenSessioninViewパターンで解決する方法を見つけましたが、もっと簡単な方法があるはずです。

私のアプリは最新のglassfishアプリケーションサーバーで実行されているので知りたいですwhat the typical way to work with lazy initialization in EJB container?

4

2 に答える 2

0

すべてを EAGER として設定し、session.load の代わりに session.get を使用することもできますが、ビューでセッションを開く方が良い方法だと思います。

ちなみにこれはまさにSPringがやっていることです。ここでSpring OpenSessionInViewの実装を見ることができます:

http://static.springsource.org/spring/docs/3.0.6.RELEASE/javadoc-api/org/springframework/orm/hibernate3/support/OpenSessionInViewFilter.html

于 2011-09-18T14:09:00.723 に答える
0

これはあなたの問題です:

「しかし、私はこのフレームワークを知らないだけで、今は学びたくありません (私はただの初心者です)。」

物事が自動的に行われ、コードを記述する必要さえなかったらいいのですが、残念ながら、物事は常に良いとは限りません。テクノロジーを使用しても意味がありませんが、そのメカニズムを使用するために努力したり、学習したりしたくありません。

たくさんのオプションがあります。

1) ビューでセッションを開きます。これを行うために時間を費やしてください。それは難しいことではありません。これが行うことは、リクエストの存続期間中セッションを開いたままにすることです。そのため遅延関係にアクセスすると、セッションがそこにあり、データをロードできます。@ Danny.lesnik の答えは正しくありません。私が読んだところによると、彼は、OSiV がアソシエーションを熱心にするだけであり、それが行うことではないことを暗示しています。Spring を使用したくない場合は、おそらく手で OSiV パターンを実装する例を見つけることができます。それはそれほど悪くはないはずであり、おそらく良い学習体験です。

2) 特定のシナリオに必要なすべてのデータをロードできるように、カスタム マッピング/hql を記述します。これは、すべてのオブジェクトをロードするということではありません。テーブルから特定のフィールドをロードして、フェッチを可能な限り無駄なくすることができます。たとえば、hibernate/jpa マッピング/注釈を遅延させてから、結合でテーブル全体の列から特定のフィールドのみをフェッチするカスタム DAO メソッドを作成できます。これは、いくつかのチューニング/キャッシュ/インデックスで非常に高速になる可能性があります。

両方のオプションのうち、1 の方が簡単です。ドキュメントを参照するだけでよく、ほとんどが構成です。OSiV には独自の複雑さがあることに注意してください。たとえば、データを変更しても結果をユーザーに表示する例外があり、トランザクションが特定の方法で構成されている場合、変更はロールバックされます。オプション 2 には、OSiV を必要としないという利点があり、それに付随するすべての複雑さがあります。また、データベースとのやり取りをより詳細に制御できるという利点がありますが、より多くの作業を行わなければならないというトレードオフがあります。

于 2011-09-18T17:20:11.750 に答える