2009-08-25 4 views
1

Я довольно новичок в Spring, и мне хотелось бы узнать немного больше о сеансах. Я сопоставил устаревшую базу данных с аннотированными объектами Hibernate и создал несколько объектов службы для извлечения, извлечения и т. Д. Мои сущности также содержат другие объекты (сопоставленные через внешние ключи) и наборы объектов. Когда я пересекаю график entitiy в своих сервисах, у меня нет проблем. Мои сервисы были завернуты в TransactionProxyFactoryBean, поэтому все должно быть хорошо.Базы данных-сессии весной

Итак, в моем контроллере просмотра я запрашиваю кучу сущностей из служб. Но когда я пересекаю граф сущности в контроллере моего представления (например, для отображения имени страны пользователя, когда состояние и страна являются лениво загруженными объектами), сеанс Hibernate уже закрыт, и я получаю «LazyInitializationException: невозможно инициализировать прокси-сервер», нет сеанса "

Я бы не хотел, чтобы мои службы с нетерпением собирали данные, которые будут потреблять много памяти, потому что мои графики глубоки и могут даже иметь круговые ссылки. Я также не хочу явно касаться частей, которые я буду показывать в сервисах, так как это будет означать, что мне придется копировать/вставлять подобные услуги снова и снова. Поэтому я хочу, чтобы сеанс Hibernate все еще был открыт, когда я нахожусь в контроллере просмотра, а не закрываю сессию до тех пор, пока не будет показано представление. Что я могу сделать, чтобы открыть его?

Моя бина выглядит так: можно ли каким-либо образом вставлять в нее свой производный компонент TransactionProxyFactoryBean?

<bean name="/" class="example.SimpleViewController"> 
    <property name="userService" ref="userService"/> 
    <property name="catalogService" ref="catalogService"/> 
    </bean> 

Приветствия

Nik

ответ

1

Смотрите мой ответ на этот вопрос: In Spring with jpa/hibernate, how do I keep a session open to avoid lazy initialization exceptions?

Я использую Hibernate без весны, так что я не уверен на 100% из возможностей Spring должен дело с сеансами, но я считаю, что у него есть как встроенный фильтр, так и перехватчик. Лучший способ обрабатывать сеансы вне JPA - это написать фильтр, который открывает сеанс перед передачей остальной части вашей серверной части, а затем закрывает сеанс позже. Я считаю, что это то, что создает Spring в материалах.

+0

Очень распространенная проблема. Открытие сеанса в фильтре - это путь. –

0

Вам все равно придется использовать шаблон open-session-in-view, чтобы избежать этой конкретной проблемы, независимо от того, используете ли вы Spring; хотя Spring имеет некоторые возможности для помощи в реализации шаблона проектирования на некоторых платформах, таких как Struts или простой JSP.