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

Например, в слое 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
19.03.2012, 15:29:14
    #37711886
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Ленивые зависимости вытаскиваются из текущей сессии. У вас сессия закрыта. Вы вообще про ленивую загрузку не читали?
...
Рейтинг: 0 / 0
19.03.2012, 15:36:41
    #37711899
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Приветствую, Blazkowicz!

Ясно, благодарю. К сожалению, иногда приходится learning by doing. Согласен, вопрос нужно проработать тщательным образом.
...
Рейтинг: 0 / 0
19.03.2012, 15:39:43
    #37711906
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
ivanov-void,
держи ньансы сабжа:
http://habrahabr.ru/post/111911/
...
Рейтинг: 0 / 0
19.03.2012, 15:41:56
    #37711914
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Petro123, спасибо!
...
Рейтинг: 0 / 0
19.03.2012, 21:37:25
    #37712505
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Собственно, депроксирование посредством 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
19.03.2012, 21:48:54
    #37712520
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Open Session In View это тоже антипаттерн от безысходности. Его можно использовать для тестовых целей, но по-хорошему данные уже должны быть сформированы в контролере, когда он их получает от сервиса. А так у вас View слой ходит в базу когда ему вздумается.
...
Рейтинг: 0 / 0
19.03.2012, 21:56:47
    #37712530
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
BlazkowiczOpen Session In View это тоже антипаттерн от безысходности. Его можно использовать для тестовых целей, но по-хорошему данные уже должны быть сформированы в контролере, когда он их получает от сервиса. А так у вас View слой ходит в базу когда ему вздумается.
дело же не в контроллёре.
Всё бОльше ГУИ хотят ходить в БД когда им вздумается (ZK на каждый MoiseEvent - лезет на сервер).
Из-за этого у них проблемы с хибером (ZK).
Т.е. MVC не работает при AJAX.
...
Рейтинг: 0 / 0
19.03.2012, 21:58:24
    #37712532
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
ivanov-voidбез последующего закрытия
отпишись о рез-те.
Мне интересны длинные транзакции по 8 часов.
...
Рейтинг: 0 / 0
19.03.2012, 21:59:34
    #37712534
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Petro123Т.е. MVC не работает при AJAX.
У меня работает. Что я делаю не так?
...
Рейтинг: 0 / 0
19.03.2012, 22:00:41
    #37712535
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
BlazkowiczPetro123Т.е. MVC не работает при AJAX.
У меня работает. Что я делаю не так?
я вашего ГУИ не видел.
Работа-работе рознь.
...
Рейтинг: 0 / 0
19.03.2012, 22:02:07
    #37712536
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
BlazkowiczА так у вас View слой ходит в базу когда ему вздумается.

Согласен.

Petro123, хорошо, мне самому интересно.
...
Рейтинг: 0 / 0
20.03.2012, 09:23:09
    #37712812
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
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
20.03.2012, 09:40:24
    #37712834
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
ivanov-voidOpen Session in View
у меня всё нет времени проверить, вот код на который весь инет ведёт. Посмотри его, только отпишись потом
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=916663&msg=12063401
...
Рейтинг: 0 / 0
20.03.2012, 11:14:36
    #37712988
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Посмотрел, внес соответствующие изменения в фильтр; проблема разрешилась, однако появилась другая -

Код: 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
20.03.2012, 11:29:05
    #37713028
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Небольшая ремарка - там
Код: java
1.
// business layer

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

Странное исключение, если принять во- внимание тот факт, что сессия закрыта к тому моменту и открыта снова.
...
Рейтинг: 0 / 0
20.03.2012, 11:34:27
    #37713042
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Какие-то у вас стандартные грабли. Хибер получил 2 экземпляра одного и того же класса с одним и тем же PK. Он озадачен тем какой же из двух инстансов ему использовать. Откуда у вас в системе два экземпляра - покажет дебаг.
...
Рейтинг: 0 / 0
20.03.2012, 11:38:20
    #37713060
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Blazkowicz, ясно, благодарю.
...
Рейтинг: 0 / 0
20.03.2012, 14:33:51
    #37713543
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Код: 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
20.03.2012, 14:51:10
    #37713572
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Что вы мучаетесь. Возьмите Spring с декларативным управлением транзакциями.
...
Рейтинг: 0 / 0
20.03.2012, 14:55:00
    #37713580
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
ivanov-voidРеализации методов dao похожи, т.е. закрыть сессию в них нельзя, иначе коммит из фильтра потом не пройдет. Вопрос, т.о., сводится к тому, чтобы в рамках текущей сессии проделать приведенную выше последовательность действий.
я не понял твоей проблемы:
1. кто мешает сделать эту посл-ть?
2. следить за _лишним_ BeginTransaction нужно везде, не только в ОРМ, но и в БД.
3. этот код на самом деле не запрос на view, а запрос на реквест.
Причём "на реквест" он становится не таким особенным, т.к. ты просто вынес строку "ВсёКоммит" из сервлета на уровень выше, в фильтр (ООП).
Т.е. - делай! Кто мешает?
...
Рейтинг: 0 / 0
20.03.2012, 14:55:45
    #37713584
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
BlazkowiczЧто вы мучаетесь. Возьмите Spring с декларативным управлением транзакциями.
он уже сделал.
У него нет в сервлете транзакций.
...
Рейтинг: 0 / 0
20.03.2012, 14:59:03
    #37713589
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
Если разговор всё ещё про NonUniqueObjectException, то как-то всё равно не понятно откуда второй экземпляр.
...
Рейтинг: 0 / 0
20.03.2012, 15:49:09
    #37713715
ivanov-void
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate: LazyInitializationException: failed to lazily initialize a collection of role
BlazkowiczЧто вы мучаетесь. Возьмите Spring с декларативным управлением транзакциями.

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

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

Мне тоже.

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

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

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

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


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