Hibernate совет (держать сеанс открытым) - PullRequest
0 голосов
/ 29 марта 2012

Я здесь для небольшого совета. Я использую Hibernate с Java. Я реализовал интерфейс контроллера, чтобы отделить интерфейс пользователя от фактического взаимодействия с базой данных. Для данного интерфейса я реализовал класс контроллера базы данных, который осуществляет фактическое взаимодействие. Это подается на пользовательский интерфейс фабрикой статического контроллера.

Теперь я обнаружил, что Hibernate на самом деле не загружает все, что я хочу, в память. Для каждого вызова метода контроллера я всегда открываю сессию, делаю свое дело, закрываю сессию. Поэтому, когда я пытаюсь получить доступ к моей структуре объекта, мне выдается ошибка, что

could not initialize proxy - no Session

Без особых усилий и поиска в Google я пришел к выводу, что объект, на который ссылается мой активный объект, отсутствует в памяти.

Теперь у меня есть возможность оставить сеанс открытым с момента, когда я начну использовать свои объекты до конца. Но это кажется немного избыточным и энергоэффективным. Полагаю, я не потеряю много, если оставлю сеанс открытым, но я как бы намеревался не допустить, чтобы пользовательский интерфейс был полностью недоступен для бизнеса с базами данных. Наличие в моем интерфейсе контроллера метода «tearDown» (и «setUp») для пользовательского интерфейса немного противоречит данной логике.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

Когда вы используете отложенную загрузку - это часто бывает по умолчанию в Hibernate - вы не можете получить доступ к незагруженным экземплярам после закрытия сеанса.

Например, у вас есть родительская таблица и дочерняя таблица, которые отображаются в отношении 1: n (в файле отображения или в виде аннотации). Тогда вы делаете так:

1) открытая сессия
2) загрузить родителя
3) закрытие сессии
4) вызовите parent.getChild () (или что-то подобное)
Затем на шаге 4) вы получите сообщение об ошибке, потому что Hibernate не загружал элемент раньше, он хочет сделать это сейчас (ленивая загрузка), но не может, потому что сессия уже закрыта.

Если вы хотите закрыть сеанс, убедитесь, что все необходимые данные уже загружены. Например, если вы выполнили шаг 4) до шага 3) в этом примере, он бы сработал, и после закрытия сеанса вы даже можете снова получить доступ к этому дочернему элементу, поскольку он уже будет загружен. Но вы не сможете сохранить его в базе данных позже из-за закрытого сеанса.

0 голосов
/ 29 марта 2012

Я не понимаю. Вы можете загрузить объекты сущностей из БД и использовать их после закрытия сессии. Состояния объектов будут тогда отделены. Возможно, вам придется иногда подключать их к сеансу, чтобы синхронизировать их состояния с базой данных.

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