2015-02-02 4 views
0

Я использую Spring-mvc и спящий сеанс-фабрику.Hibernate - невозможно инициализировать прокси-сервер - нет сеанса

@Controller 
    | 
    -> @Service (@Transactional) 
      | 
      -> @Repository 

У меня есть 2 сущностей, User и Address.

У пользователя есть List<Address> с FetchType=LAZY.

Если я добавляю объект Address через пользователя, в пределах @Controller, я получаю исключение failed to lazily initialize a collection of role - could not initialize proxy - no Session.

Но если я делаю это внутри служебного слоя, который обернут @Transactional, работа работает красиво.

Я узнал про прокси-серверы hibernate, ... и т. Д.

Мой вопрос в том, почему @Controller не может изменить объект сущности, который повторен с @Service. Потому что @Controller не имеет понятия, является ли это спящим прокси-сервером или чем-то еще. К @Controller это просто объект. Итак, почему я получаю сообщение об ошибке, если я изменяю объект объекта внутри @Controller. Это происходит только с объектами, которые отмечены как FetchType=LAZY.

ответ

2

Когда вы выбираете свойство для ленивой загрузки, hibernate обертывает те вокруг прокси, имеющие объект сеанса, в котором был выбран родительский объект.

Если вы попытаетесь получить доступ к свойству после сеанса, вы получите эту ошибку.

Похоже, что ваша сессия создается и закрывается в сервисном слое.

Внесите OpenSessionInView Фильтр, предоставленный пружиной, он закроет сеанс после отправки ответа.

+0

Но есть ли связь между контроллером и дао? – user2172625

+0

Нет, реализуя OpenSessionInViewFilter, вы фактически удаляете управление сеансом из своего кода, тем самым отделяя свои проблемы, которые хороши. Это фильтр сервлетов, который будет управлять сеансом спящего режима для вас, и вы можете писать код, не беспокоясь о сеансе спящего режима. – VGaur

Смежные вопросы