現在、次のようなコードを含むページで LazyInitException が発生しています。
<h:form>
<ui:repeat value="#{searchBean.storiesByTag}" var="iStory">
<ui:repeat value="{iStory.tags}"var="iTag">
<!-- Lazy init exception here -->
#{iTag.content}
</ui:repeat>
</ui:repeat>
</h:form>
storiesByTag()
List
ストーリーを取得する Bean メソッドです。2 つ目ui:repeat
は、各タグを取得してそのコンテンツを表示することになっています。必要以上のオブジェクトをロードしないように、すべてのフェッチはデフォルトで遅延されます。
私はまだこれについて曖昧ですが、私が理解していることから、これは、リクエスト中にEntityManager
が閉じられている (@Transactional
クラウドから出ている) か、Collection
がアクセスされているために発生する可能性があります。
Spring のOpenEntityManagerInViewFilter
Spring がプロジェクトに追加されましたが、正しく機能しているかどうかはわかりません。これをテストするための提案は大歓迎です。
ここCollection
で問題があると思うので、何が良い解決策になるか知りたいです。でDAOメソッドを変更する必要がありfetch join
ますか? <f:view beforePhaseListener=...>
それとも、Bean 内でメソッドをトリガーし、データベースからいくつかの新しい Tag オブジェクトを取得するために使用するハック ルートを使用する必要がありますか?
編集:Bozhoの場合:
web.xml :
<!-- Open EM in View Filter -->
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- End -->
ローマンの場合:
applicationContext.xml :
<!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory"/>