2009-09-02 2 views
9

Где наиболее часто встречающихся мест, где вы получили org.hibernate.LazyInitializationException в Grails, в чем была причина и как вы его решали?Исключение инициализации Grails и Hibernate

Я думаю, что это единственное исключение для новичков очень много, поэтому, если бы вы предоставили больше примеров, было бы здорово.

ответ

10

Давайте рассмотрим пример:

class Book { 
    String title 
    Author author 
} 

class Author { 
    ... 
} 

Book book = Book.get(1) 

Как известно, по умолчанию выборки режим ленив в классах домена. Учитывая вышеприведенный пример, скажем, мы получаем объект книги, тогда объект Book автоматически привязывается к объекту сеанса hibernate i.e кешу первого уровня. И после того, как объект домена будет отсоединен от объекта сеанса, а затем мы попытаемся извлечь book.author, на данный момент он вызывает исключение инициализации Lazy.

Таким образом, решение, чтобы иметь или режим извлечения как хотят или прикрепить объект книги в спящий режим сеанса, используя код ниже:

if(!book.isAttached()){ 
    book.attach() 
} 

Приведенное выше описание является одним из сценария. Могло быть еще много. Я прошу других поделиться с вами.

+1

Это работает для меня действительно хорошо, но утомительно размещать его везде, где это необходимо! – IgniteCoders

+0

@IgniteCoders Amit не кажется активным в SO. Знаете ли вы, какие причины и объекты должны быть отделены в один сеанс? –

+0

@ AlexSuraphel Я действительно не знаю. Я просто помещаю его, когда исключение возникает где-то – IgniteCoders

1

У меня есть один, потому что я проверял, было ли у пользователя разрешение на выполнение каких-либо действий с JSecurity/Shiro в службе, которая не была транзакционной. В итоге мне просто пришлось настроить службу как транзакционную, чтобы избавиться от исключения.

Больше информации здесь: http://www.nabble.com/JSecurity-LazyInitializationException-in-default-DbRealm.isPermitted%28%29-td24939803.html