База данных сессий весной - PullRequest
1 голос
/ 25 августа 2009

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

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

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

Мой bean-компонент вида выглядит следующим образом, есть ли способ, которым я могу внедрить в него мой компонент TransactionProxyFactoryBean-производный?

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

Приветствия

Nik

Ответы [ 2 ]

1 голос
/ 25 августа 2009

См. Мой ответ на этот вопрос: В Spring с jpa / hibernate как сохранить сеанс открытым, чтобы избежать отложенных исключений при инициализации?

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

0 голосов
/ 25 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...