powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
25 сообщений из 38, страница 1 из 2
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37711883
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

Например, в слое DAO у меня есть метод, возвращающий список потомков некоторой сущности -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
    public List<Parent> getChilds(Integer id1) {
    	try {
	    	session = HibernateUtil.getSessionFactory().openSession();
	    	parent = (Parent)session.get(Parent.class, id1);
		} finally {
		      if(session != null && session.isOpen()) {
		        session.close();
		      }    
		}
        return parent.getChildList();
    }

...



В бизнес- слое я хочу обратиться к нему некоторым образом-

Код: java
1.
2.
3.
4.
...
List<Childs> l = dao.getChilds(identifier);
...
.....l.size().............



Однако на l.size() выбрасывается исключение такого характера -

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ....., no session or session was closed

С чем это может быть связано? Был бы весьма признателен за информацию.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37711886
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ленивые зависимости вытаскиваются из текущей сессии. У вас сессия закрыта. Вы вообще про ленивую загрузку не читали?
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37711899
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую, Blazkowicz!

Ясно, благодарю. К сожалению, иногда приходится learning by doing. Согласен, вопрос нужно проработать тщательным образом.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37711906
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanov-void,
держи ньансы сабжа:
http://habrahabr.ru/post/111911/
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37711914
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123, спасибо!
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712505
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, депроксирование посредством initializeAndUnproxy эффекта не возымело, возможно, в силу не верного применения - я передал в описанный метод экземпляр класса Parent, полученный из текущей сессии и далее попытался из него вернуть список, однако исключение осталось тем же.

Возможно, этот фильтр, насколько я понимаю, должен решить проблему -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
...
public class HibernateSessionRequestFilter implements Filter {
    private static final Logger logger = Logger.getLogger(HibernateSessionRequestFilter.class);
    private SessionFactory sf;

    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
            throws IOException, ServletException {
        try {
            sf.getCurrentSession().beginTransaction();
            chain.doFilter(request, response);
            sf.getCurrentSession().getTransaction().commit();
        } catch (StaleObjectStateException staleEx) {
        	logger.error(staleEx.getMessage(), staleEx);
            throw staleEx;
        } catch (Throwable ex) {
        	logger.error(ex.getMessage(), ex);
            try {
                if (sf.getCurrentSession().getTransaction().isActive()) {
                    sf.getCurrentSession().getTransaction().rollback();
                }
            } catch (Throwable rbEx) {
            	logger.error(rbEx.getMessage(), rbEx);
            }
            throw new ServletException(ex);
        }
    }
    public void init(FilterConfig filterConfig) throws ServletException {
        sf = HibernateUtil.getSessionFactory()
    }
    public void destroy() {    	
    }
}
...



++ маппинг в web.xml

Т.е. в DAO- слое будет вызов .....getCurrentSession(); без последующего закрытия.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712520
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Open Session In View это тоже антипаттерн от безысходности. Его можно использовать для тестовых целей, но по-хорошему данные уже должны быть сформированы в контролере, когда он их получает от сервиса. А так у вас View слой ходит в базу когда ему вздумается.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712530
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczOpen Session In View это тоже антипаттерн от безысходности. Его можно использовать для тестовых целей, но по-хорошему данные уже должны быть сформированы в контролере, когда он их получает от сервиса. А так у вас View слой ходит в базу когда ему вздумается.
дело же не в контроллёре.
Всё бОльше ГУИ хотят ходить в БД когда им вздумается (ZK на каждый MoiseEvent - лезет на сервер).
Из-за этого у них проблемы с хибером (ZK).
Т.е. MVC не работает при AJAX.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712532
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanov-voidбез последующего закрытия
отпишись о рез-те.
Мне интересны длинные транзакции по 8 часов.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712534
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Т.е. MVC не работает при AJAX.
У меня работает. Что я делаю не так?
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712535
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123Т.е. MVC не работает при AJAX.
У меня работает. Что я делаю не так?
я вашего ГУИ не видел.
Работа-работе рознь.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712536
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczА так у вас View слой ходит в базу когда ему вздумается.

Согласен.

Petro123, хорошо, мне самому интересно.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712812
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Сессию хибера лучше открывать в начале реквеста и закрывать в конце. А не дробить транзакции так мелко.

ivanov-voidТ.е. в DAO- слое будет вызов .....getCurrentSession(); без последующего закрытия.

Однако в Open Session in View ничего об этом не говорится, по- крайней мере, фильтр не содержит релевантного кода закрытия/ открытия сессии.

Код: java
1.
2.
3.
4.
5.
6.
...
            sf.getCurrentSession().beginTransaction();
            chain.doFilter(request, response);
            sf.getCurrentSession().getTransaction().commit();

...



Но понятно, что если не закрывать, то транзакции будут именно такими, как вы указали. Однако если закрывать, то проблема, описанная в начале поста остается.

Могу- ли я добавить в фильтр код, открывающий сессию перед передачей по цепочке фильтров и затем закрывающий после коммита?
Соответственно, убрать его из DAO- слоя.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712834
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanov-voidOpen Session in View
у меня всё нет времени проверить, вот код на который весь инет ведёт. Посмотри его, только отпишись потом
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=916663&msg=12063401
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37712988
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел, внес соответствующие изменения в фильтр; проблема разрешилась, однако появилась другая -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
HibernateUtil.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
HibernateUtil.getCurrentSession().getTransaction().commit();
...
        finally {
	    	  HibernateUtil.closeSession();
        }
...



, где:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
    public static void closeSession() throws HibernateException {
        try {
            Session s = (Session) threadSession.get();
            threadSession.set(null);
            if (s != null && s.isOpen()) {
                s.close();
            }
        } catch (HibernateException ex) {
            throw new HibernateException(ex);
        }
    }

...



...и -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
    public static Session getCurrentSession() throws HibernateException {
        Session s = (Session) threadSession.get();
        try {
            if(s == null) {
            	s = getMarksistSessionFactory().openSession();
            }
            threadSession.set(s);
        } catch (HibernateException ex) {
            throw new HibernateException(ex);
        }
        return s;
    }

...



Далее я добавляю родительскую сущность -
...
// presentation layer
if(dao.save(gbCapacityEntity)) ....
...
// dao layer
session = HibernateUtil.getCurrentSession();
session.save(gbCapacity);
session.flush();
...

Все Ок. Потом привязываю к ней потомков и обновляю -
...
if(gbCapacityDAO.update(gbCapacity)...
...

Исключение:

Cause: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.intellex.marksist.hbn.model.GbCapacity#307456]
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713028
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшая ремарка - там
Код: java
1.
// business layer

имелся в виду.

Странное исключение, если принять во- внимание тот факт, что сессия закрыта к тому моменту и открыта снова.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713042
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие-то у вас стандартные грабли. Хибер получил 2 экземпляра одного и того же класса с одним и тем же PK. Он озадачен тем какой же из двух инстансов ему использовать. Откуда у вас в системе два экземпляра - покажет дебаг.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713060
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, ясно, благодарю.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713543
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
...
HibernateUtil.getCurrentSession().beginTransaction();
chain.doFilter(request, response);
HibernateUtil.getCurrentSession().getTransaction().commit();
...
HibernateUtil.closeSession();
...



Скажем, некоторый функционал предполагает сохранение определенной сущности по запросу -

Код: java
1.
2.
3.
...
dao.save(e)
...



Сам метод save:

Код: java
1.
2.
3.
4.
5.
6.
...
	public void save(E e) {
        session = HibernateUtil.getCurrentSession();
        session.save(e);
        }
...



После этого сессия закрыта через фильтр.

Далее на один запрос имеет место несколько последовательных обращений к слою персистенции -

Код: java
1.
2.
3.
4.
5.
6.
7.
...
e = dao.getEntity(id);
e.getChilds.add(child);
...     
dao.update(e) 
dao.save(child)
...



Реализации методов dao похожи, т.е. закрыть сессию в них нельзя, иначе коммит из фильтра потом не пройдет. Вопрос, т.о., сводится к тому, чтобы в рамках текущей сессии проделать приведенную выше последовательность действий.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713572
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что вы мучаетесь. Возьмите Spring с декларативным управлением транзакциями.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713580
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanov-voidРеализации методов dao похожи, т.е. закрыть сессию в них нельзя, иначе коммит из фильтра потом не пройдет. Вопрос, т.о., сводится к тому, чтобы в рамках текущей сессии проделать приведенную выше последовательность действий.
я не понял твоей проблемы:
1. кто мешает сделать эту посл-ть?
2. следить за _лишним_ BeginTransaction нужно везде, не только в ОРМ, но и в БД.
3. этот код на самом деле не запрос на view, а запрос на реквест.
Причём "на реквест" он становится не таким особенным, т.к. ты просто вынес строку "ВсёКоммит" из сервлета на уровень выше, в фильтр (ООП).
Т.е. - делай! Кто мешает?
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713584
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЧто вы мучаетесь. Возьмите Spring с декларативным управлением транзакциями.
он уже сделал.
У него нет в сервлете транзакций.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713589
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если разговор всё ещё про NonUniqueObjectException, то как-то всё равно не понятно откуда второй экземпляр.
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713715
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЧто вы мучаетесь. Возьмите Spring с декларативным управлением транзакциями.

Это Vaadin; есть некоторые преодолимые сложности в вопросах интеграции со Spring, пока этим не занимался, хотя как свести их, знаю.

BlazkowiczЕсли разговор всё ещё про NonUniqueObjectException, то как-то всё равно не понятно откуда второй экземпляр.

Мне тоже.

Petro123 У него нет в сервлете транзакций.

Спасибо за пример аналогии!

Мешает все тот же NonUniqueObjectException. Может, hashcode() и equals() добавить в сущности? Странно, что не помогает .....flush()...

Есть- ли способы разорвать эту "already associated with the session"?
...
Рейтинг: 0 / 0
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
    #37713734
Фотография ivanov-void
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, вылетает на dao.update(e) - заменяю на merge(e) - спотыкаюсь о dao.save(child) .
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]