2

プロジェクトでSpring+JPA+Hibernateを使用しています。プロジェクトは次のように構成されています。-DAOレイヤー-データの取得を担当します。DAOは、モデルオブジェクトの形式でデータを返します。-サービスレイヤー-DAOを呼び出し、UIに必要な形式で(モデル)データを処理/変換します。

サービスレイヤーのメソッドに@Transactionalを使用しています。

Lazilyにロードされたコレクションからデータを読み取っているときに、「Sessionisclosed」エラーが発生することがあるという問題に直面しています。また、私はこの問題に一貫して直面していません。TestNGテストから実行しているときや、アプリケーションがWARとしてデプロイされているときにも、このエラーが発生することがあります。

TestNGテストの実行中に発生した例外を貼り付けています。

org.hibernate.SessionException:セッションが閉じられました!org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:72)at org.hibernate.impl.SessionImpl.getBatcher(SessionImpl.java:305)at org.hibernate.loader.Loader.doQuery(Loader.java:854) )org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)at org.hibernate.loader.Loader.loadEntity(Loader.java:2037)at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader。 java:86)org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:76)at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3268)at org.hibernate.event.def org.hibernate.event.defの.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:496)。

これは、Spring / JPA/Hibernateを使用した最初のプロジェクトです。この問題の原因を特定できませんか?また、この問題を解決するために何ができるでしょうか?

さらに情報が必要な場合はお知らせください。ヘルプ/ポインタは大歓迎です:)

4

1 に答える 1

1

レイジーオブジェクトをフェッチしているときは、実際のオブジェクトではなくプロキシオブジェクトを受け取ります。

これは、トランザクションが終了してセッションが閉じられた後に、開始されていないプロキシオブジェクトにアクセスしようとしていることが原因である可能性があります。

次の2つのオプションについて検討する必要があると思います。

  1. トランザクション境界を真剣に確認し、すべてのオブジェクト操作がそれらのトランザクション境界内で行われることを確認してください。「OpenSessionInView」のデザインパターンのようなものになります。

  2. すべてのコレクションを作成しますEAGER。その場合、多くの不要なデータベースクエリを受け取ります。

それが役に立てば幸い。

于 2012-04-28T09:07:01.587 に答える