В настоящее время я испытываю исключение 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()
- это метод bean-компонента, который извлекает List
историй.Второй ui:repeat
должен затем взять каждый тег и отобразить его содержимое.Все выборки по умолчанию ленивы, чтобы избежать загрузки большего количества объектов, чем необходимо.
Я все еще не уверен в этом, но, насколько я понимаю, это может произойти, потому что EntityManager
закрыт (выход из @Transactional
cloud) во время запроса или Collection
.
Spring * OpenEntityManagerInViewFilter
от Spring был добавлен в проект, но я не уверен, что он выполняет свою работу правильно.Любые предложения по проверке этого приветствуются.
Поскольку я предполагаю, что проблема здесь Collection
, я хотел бы знать, что было бы хорошим решением.Должен ли я изменить метод DAO с fetch join
?Или я должен пойти по хакерскому маршруту, используя <f:view beforePhaseListener=...>
, чтобы вызвать метод внутри компонента и получить несколько свежих объектов 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"/>