![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| garbuz |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
Здравствуйте. Вот для копаюсь со Spring и SpringMVC. Решил написать некое подобие блога. Итак.
Класс Post.java
Класс PostDAOImpl.java
Контроллер
В этой строке
бросается org.hibernate.LazyInitializationException: could not initialize proxy - no Session. Т.е. происходит вызов template.load(ost.class, postId), когда пытаюсь выбрать все посты через template.find("FROM Post order by createdDate"), то все нормально. Почему объект Post никак не получить через load()? Ладно бы я явно где-то обращался post.getTags(), тем более у полей класса Post, что собираюсь использовать стоит FetchType.EAGER. |
||||||||
|
|||||||||
| _and |
|
|||
![]() Java-developer ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 6.8.2004 Где: Новокузнецк Репутация: 1 Всего: 4 |
попробуй использовать в getById(Long postId) метод template.get()
|
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Когда вы получили объект, есть недогруженные данные (lazy-load), и вы недогруженный объект возвращаете, потом спринг отрубает коннект к БД, и потом наверное идет сериализация объекта, т.е. обращение к его всем данным, механизм lazy-load это хватает и пытается догрузить остальные данные - обращается к БД, но конекта уже нет!!!
Чтобы избежать ошибку нужно загрузить все данные до дисконнекта, для этого есть специальный метод HibernateTemplate.initialize( Serializable object ) - он не рекурсивный. А если какие-то данные не нужны, то необходимо сделать их null до initialize. ЗЫ. И вообще, подобные ошибки должны отлаживаться на уровне функциональных тестов. Это сообщение отредактировал(а) pompei - 7.5.2009, 07:02 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
ну вроде даже как помогло. Это понятно. Если делать типа такого, то возникает такое же исключение
Как я понимаю, template сам после загрузки закрывает сессию и нам даже насильно уже ничего не проинициализировать. |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 28 Всего: 159 |
Вот это еще посмотрите: Open Session in View. Разделяю мнение pompei, скорее всего идет обращение к данным, которые должны быть лениво загружены, когда сессия уже закрыта.
|
|||
|
||||
| _and |
|
|||
![]() Java-developer ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 6.8.2004 Где: Новокузнецк Репутация: 1 Всего: 4 |
2powerOn, где-то читал про то что так не кошерно делать сцылку че-то найти не могу
|
|||
|
||||
| garbuz |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
Спасибо, гляну.
Нет, эксепшн вылетает еще до обращения к каким-либо данным, делаю так:
У объекта Post все поля, которые связаны с другими таблицами стоит FetchType.EAGER. После выполнения этой строчки
Уже эксепшн в дебаггере наблюдаю и все поля null, даже те что никак не связаны с другими объектами. |
||||||
|
|||||||
| garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
При использовании вышеуказанного метода с использовнием load, выборки вообще не приосходит, вто что пишет хибернейт
Типа сперва выбираются все посты, когда загружается главная страница, потом когда щелкаю читать далее, должен выбраться конкретный пост, но он не выбирается, выбираются только комментарии. |
|||
|
||||
| Tony |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
Иcпользуйте Hibernate.initialize();
|
|||
|
||||
| garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
Так а в каком месте использовать?
Так не работает. Тот же ексепшн. |
|||
|
||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Значит не всё загружено - остались ещё "ленивые" данные - смотри внимательней. У меня очень много уверенности полагать что ошибка именно в этом - съел сабаку на этом (просто обожрался). Попробуй сделать без initialize - по тупому обратись ко всем, всем, всем данным (придётся ставить if-ы - проверки на null), и ошибка должна исчесть, ну а потом постепенно меняй на initialize Это сообщение отредактировал(а) pompei - 8.5.2009, 10:38 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| garbuz |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
Делаю так. вызываю из контроллера
сам метод
далее в контроллере обращаюсь
при первом же обращении к обхекту post валится эксепшн. id - это же не ленивые данные?! Какой тогда нафиг эксепшн? Самое интересное что, при вызове template.get Все работает. Смотрим доки хибернейта
Насколько я понял оба метода выполняют одно и то же действие - различие в том, что метод load надо использовать только тогда, когда ты уверен, что нужный объект существует, ну а я же знаю, что он существует. |
||||||||||
|
|||||||||||
| pompei |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Может просто объекта с таким идентификатором нету в БД?
Короче ошибка какая-то тупая и идиотская, но очень хорошо замаскированная!!! Попробуйте программу дать посмотреть другому программисту со свежим умом (и обязательно выспавшемуся), он скорей всего быстро найдёт. Это сообщение отредактировал(а) pompei - 12.5.2009, 06:30 --------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
| Старовъръ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.5.2008 Репутация: 1 Всего: 10 |
Про варианты борьбы с ленивой загрузкой можно здесь почить.
Попробовал пользовать load() - валятся все тесты)) Это сообщение отредактировал(а) Старовъръ - 12.5.2009, 12:35 -------------------- |
|||
|
||||
| _and |
|
|||
![]() Java-developer ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 6.8.2004 Где: Новокузнецк Репутация: 1 Всего: 4 |
||||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |