3

コンソール アプリケーションで Spring 3.1 と Hibernate 4 を使用しています(これらのフレームワークとそれらの統合のいくつかの機能を試しています)。

非 Web アプリケーションLazyInitializationExceptioinで Hibernateを解決するにはどうすればよいですか?

の使用OpenSessionInViewFilterについては心配していますが、サーブレットを使用しないアプリケーションについては心配していません...問題を解決する正しい方法はどれですか?

4

1 に答える 1

4

hibernateによってロードされたインスタンスをコンソールアプリケーションのビューレイヤーに返す前に、ビューレイヤーで表示またはアクセスする必要のあるエンティティが初期化されていることを常に確認してください。

次の方法を使用して、エンティティを強制的に初期化できます。

  1. Hibernate.initialize()

    たとえば、ビューレイヤーにすべてのを表示する必要があり orderDetailますOrderが、コンソールアプリケーションはインスタンスのみをロードしorderます。ビューレイヤー orderDetailに戻る前に、が遅延ロードされていると仮定 して、を呼び出しますorderHibernate.initialize(order.getOrderDetail())

  2. フェッチ結合を使用して、orderDetailとともにフェッチします。orderこれにより、返さorderれるオブジェクトはorderDetail完全に初期化されます。

    SELECT order FROM Order order join fetch order.orderDetail


アップデート :

fetch = FetchType.EAGER@OneToMany3番目のオプションです。aorderがロードされると、それorderDetailも自動的にロードされて初期化されます。ただし、これはグローバルに影響します。絶対に確実でない限り、通常、デフォルトのレイジーフェッチプランを@OneToManyマッピングメタデータでの積極的なフェッチに変更しません。代わりに、fetch join(オプション2)を使用して、特定のユースケースで熱心にフェッチされるデフォルトのレイジーフェッチプランをオーバーライドします。

于 2012-04-10T11:00:51.853 に答える