UI: повторить внутри UI: повтор и LazyInitException - PullRequest
0 голосов
/ 05 марта 2010

В настоящее время я испытываю исключение 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"/>

1 Ответ

1 голос
/ 05 марта 2010

Как называется ваша фабрика диспетчера сущностей?

Из документов OpenEntityManagerInView:

Поиск EntityManagerFactory в контексте корневого веб-приложения Spring.Поддерживает init-param фильтр «entityManagerFactoryBeanName» в web.xml;имя компонента по умолчанию - "entityManagerFactory".

Если вы указали имя, отличное от «entityManagerFactory», то фильтр не увидит вашу фабрику.

...