Ваша конфигурация выглядит правильно с SpringOpenEntityManagerInViewFilter, так что вам НЕ СЛЕДУЕТ прибегать к активному извлечению или предварительному обходу коллекции в вашем контроллере.У меня очень похожая конфигурация и шаблон в приложении, над которым я работаю, и оно работает без проблем.Одна вещь, которую вы можете попробовать, это добавить пустое контекстное местоположение в вашу конфигурацию DispatcherServlet.Не проверял, но я думаю, что он имеет поведение по умолчанию для загрузки контекста в соответствии с глобальной конфигурацией в противном случае.Это заставит сервлет диспетчера, по сути, загружать отдельный контекст, а не просто создавать пустой, наследуя от того, который создан ContextLoaderListener (что вам и нужно).
Итак,к <servlet>
объявлению DispatcherServlet добавьте:
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
Обновление: использование менеджера транзакций в спящем режиме также выглядит немного странно (учитывая, что вы используете менеджер сущностей JPA).Попробуйте изменить это, чтобы вместо этого использовать диспетчер транзакций Jpa.
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
Обновление 2: еще раз просматривая вашу конфигурацию, похоже, вы используете странное сочетание JPA и Hibernate.Например, вы определили двух менеджеров транзакций.Зачем?Кроме того, вы используете org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
(который является JPA / EntityManager), и в то же время используете org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor
(который является Hibernate / Session).Как вы ищите свои объекты в вашем DAO?Используете спящий режим или JPA EntityManager?Возможно, лучше придерживаться JPA или Hibernate, чтобы минимизировать коллизии.
У меня также были проблемы с тем, чтобы заставить Open*InViewInteceptor
работать.Фильтры кажутся более стабильными (у вас есть org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
, например, если вы выбираете hibernate pure).