2016-08-26 9 views
1

を使用して3層アプリケーションとして設計されたアプリケーションで非常に混乱する問題に直面しています* SpringデータJPA(1.8.2.RELEASE)、Hibernate(4.3.10.Final)のデータレイヤー * Spring管理サービスレイヤのPojos(@Service beans) * GUIレイヤーのWicket(7.2.0)遅延ロードはデータベースに依存していますか?

GUIレイヤーでJPAマネージドBeanを使用するときに発生する可能性のある問題を認識しています(レイジーローディング、 、ハッシュコードなど)。 Wickets LoadableDetachableModelsを使用して、各リクエスト中にすべての単一のエンティティをリロードします。

ここでは、ユーザーがツリー内のエンティティを選択できるページがあります。エンティティは前述のようにLoadableDetachableModel内にカプセル化されます。このエンティティは、別のエンティティと1:nの関係にあります。ツリーを介してエンティティを選択する場合、1:nの関係がアクセスされ、よく知られているorg.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.isb.bppm.wm.model.Product.children, could not initialize proxy - no Sessionの例外が導かれる。

これは、DB2をデータベースとして構成する場合にのみ発生するため、非常に混乱します。ローカル開発では、同じコードが前述の例外を引き起こさない、メモリapache derbyで使用しています。これまでのところ私の分析では、データベースは2つの構成の違いだけである。 SpringのOpenEntityManagerInViewFilterをリクエストごとに使用するので、セッションが開いていない状況は決して起こらないはずです。

あなたの誰かが似たような問題に直面していて、何が間違っているかもしれないかのヒントを与えることができますか?

+3

非常に難しい(非常に基本的な)例もあります。すべてのLoadableDetachableModelが正しくデタッチされていますか?標準のwicketコンポーネントに渡すか、onDetach()メソッドで切り離すかのいずれかで –

+0

私は月曜日にそれをチェックします。ヒントありがとうございます。今はモデルがすべてsetDefautModel()によって設定されていると思います。その月曜日にコメントします –

答えて

0

Thorstenのおかげで、適切に切り離されていないモデルについて私のコードをチェックしました。そして確かにこれは正しいヒントでした。 LoadableDetachableModelの実装は、org.apache.wicket.model.Modelのようにequalsとhashcodeを使用しています。モデルオブジェクトが分離されたことを示すロガーは、ログコメント内のモデルのハッシュコードを使用していたため、モデルオブジェクトをデタッチした直後にモデルオブジェクトがアタッチされました。

これは、loadableDetachableModel実装のメンバーであるエンティティIDをチェックして、equalsとhashcodeを実装することで解決しました。 IDはヌルではなく、もちろんユニークではないことが保証されているので、これは私たちのためのサーバーです。

とにかく問題が残っていますが、データベース接続を変更するだけでこの問題が判明したのはなぜですか?

+0

さて、私はWicket 1.4で2009/10にこの問題を調査しました。潜在的な違い:展開/開発モード。シリアライゼーション戦略。別のウェブコンテナ?特にローカルで開発するときには、私たちはそのようなエラーもほとんど見たことがありません...私はそれが本当にシリアライズ/デシリアライズされていないと思うことがあると思うし、スレッドも休止状態で*多分*同じです。もう一度。この問題はコーディングガイドラインに追加し、潜在的な問題をすべての人に知らせるようにしました(コードレビュー中もチェックされています) –

関連する問題