Exception in thread «main» org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:

Exception in thread «main» org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: — эта ошибка может происходить при доступе к связанной таблице при использовании Hibernate, JPA +Hibernate и т.п.

При попытке доступа к ассоциации в другой таблице, например при использовании аннотации @OneToMany или ManyToOne, по умолчанию Hibernate будет выбирать ассоциацию отложенным (ленивым) образом, т.е. соединение для наполнения записями из связанной таблицы осуществляться не будет. Это связано с производительностью — если каждый раз вытягивать все данные из всех связанных таблиц, то можно очень сильно потерять в скорости.

Для того чтобы инфраструктура Hibernate извлекала данные из ассоциаций, можно воспользоваться одним из двух способов. При первом способе ассоциация определяется с режимом выборки EAGER. Ниже показан пример аннотации: @ManyToMany(fetch=FetchType.EAGER)
Это сообщает Hibernate о необходимости выборки связанных данных в каждом запросе. Однако, как уже упоминалось, такой подход оказывает влияние на производительность извлечения данных.
Второй способ предполагает обеспечение выборки связанных данных в запросе только по требованию. Если используется запрос Criteria, можно вызвать метод Criteria.setFetchMode() и заставить Hibernate незамедлительно выполнить выборку ассоциации. В случае применения NamedQuery для инструктирования Hibernate о необходимости незамедлительной выборки ассоциации можно использовать операцию
fetch.

Пример использования в коде (взято из JPA – пример приложения Hello World):

Первая сущность имеющая отношение один ко многим

Связанная сущность:

В первом классе используется оба описанных способа — как указание left join fetch в именованном запросе, т.к. и в аннотации fetch = FetchType.EAGER.

 

 

 

Share Button
5
7651 Total Views 2 Views Today

Добавить комментарий