Исключение отложенной инициализации Grails и Hibernate
-
21-09-2019 - |
Вопрос
Где чаще всего вы получаете org.hibernate.LazyInitializationException
в Grails, в чем была причина и как вы ее решили?
Я думаю, что это единственное исключение часто встречается у новичков, поэтому, если бы вы предоставили больше примеров, было бы здорово.
Решение
Возьмем пример:
class Book {
String title
Author author
}
class Author {
...
}
Book book = Book.get(1)
Как мы знаем, режим выборки по умолчанию в доменных классах является ленивым.Учитывая приведенный выше пример, скажем, мы получаем объект книги, затем объект книги автоматически прикрепляется к объекту сеанса гибернации, то есть к кэшу первого уровня.И после того, как объект домена отделяется от объекта сеанса, а затем мы пытаемся получить book.author, в этот момент он вызывает исключение отложенной инициализации.
Таким образом, решение состоит в том, чтобы либо использовать режим выборки в режиме ожидания, либо прикрепить объект книги к сеансу гибернации, используя код, приведенный ниже:
if(!book.isAttached()){
book.attach()
}
Приведенное выше описание является одним из сценариев.Их может быть еще много.Я прошу других поделиться.
Другие советы
Я получил его, потому что проверял, есть ли у пользователя разрешение на выполнение каких-либо действий с JSecurity/Shiro в службе, которая не является транзакционной.В конце концов мне просто пришлось настроить службу как транзакционную, чтобы избавиться от исключения.
Дополнительная информация здесь: http://www.nabble.com/JSecurity-LazyInitializationException-in-default-DbRealm.isPermited%28%29-td24939803.html