2012-02-08 4 views
0

transactionsEJB2.0層に使用しており、そこからDAO層に電話をかけており、そこでは、休止状態のdbを呼び出しています。Hibernate LazyInitializationエラーに関して

問題は、今持っていますlazy="false"を設定していますので、Hibernateは、データベースへの複数の呼び出しを行っているということです、今私はlazy="true"を変更しようとしましたが、今私たち自身取得しています:

org.hibernate.LazyInitializationExceptionを:できませんでしたプロキシを初期化する - 所有しているセッションが閉じられた

エラーメッセージ。

私はSO上のいくつかの研究を行なったし、その解決策が

<prop key="hibernate.default_batch_fetch_size">30</prop> 
<prop key="hibernate.jdbc.fetch_size"></prop> 

ことができ、私の質問は、デフォルトのfetch_sizeの大きさと、これはこの問題を解決するための正しい方法であればどうなるかで見つかりました。

私がしたいのは、アプリケーションがデータベースへの複数の呼び出しを実行して、それらのすべてを実行していないことを確認することです。今すぐページ間を移動すると、ページが移動するたびに痛みが大きくなり、アプリケーションが非常に遅くなります。 Nのクエリがバックグラウンドで実行され、アプリケーションの読み込み時間が長くなります。

更新

ここでは、どのようにトランザクションを設定していますされています

* @hibernate.class table="SCHEDULE_ENTRY" discriminator-value="task" lazy="true" 
* @hibernate.discriminator column="KIND" length="4" 

は非常に休止状態のパフォーマンスを改善するための任意の提案をお願い申し上げます。

答えて

0
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed 

あなたがまだ初期化されていないと、そのオブジェクトはセッション(デタッチ)にバインドされていないオブジェクト(プロキシ)のメンバーにアクセスしようとすると、その例外を取得します。バッチサイズを変更する前に、まずその問題を解決する必要があります。

この問題を解決するには、アクセスするすべてのプロパティが初期化されていることを確認してください。 遅延ロードを使用できるトランザクション/セッション構成によって異なります。トランザクション/セッション設定を投稿すると便利です。

メンバーを初期化するのにHibernate.initialize()を使用できますが、必要な場合にのみフェッチ戦略を変更することをおすすめします。

hereをご覧ください。

私は私がセッションを閉じる前に:)

+0

トランザクションの呼び出し方法に関する詳細を更新しました。 – Rachel

1

アクセスオブジェクトのメンバーを助けることができる願っています。それは主な問題です。

+0

ここでは、ejbトランザクションとejbからdaoを呼び出すので、セッションの維持はejbトランザクションによって行われます。実行されている複数のネストされたクエリがあり、遅延例外がスローされている場所が正確ではないことがあります。 。 – Rachel

関連する問題