2009-09-02 10 views
9

Gdzie są najczęstsze miejsca, w których uzyskałeś org.hibernate.LazyInitializationException w Grails, jaki był powód i jak go rozwiązałeś?Wyjątek inicjacji luzu Grails i Hibernate

Myślę, że ten wyjątek pojawia się bardzo często dla początkujących, więc gdyby podać więcej przykładów, byłoby świetnie.

Odpowiedz

10

Weźmy przykład:

class Book { 
    String title 
    Author author 
} 

class Author { 
    ... 
} 

Book book = Book.get(1) 

Jak wiemy, domyślny tryb pobierania jest leniwy w zajęciach domen. Biorąc pod uwagę powyższy przykład, powiedzmy, że otrzymujemy obiekt book, a następnie obiekt Book zostaje automatycznie dołączony do obiektu sesji hibernacji, np. Pamięci podręcznej pierwszego poziomu. I po tym, jak obiekt domeny zostanie odłączony od obiektu sesji, a następnie spróbujemy pobrać book.author, w tym momencie wywołuje on wyjątek inicjalizacji Lazy.

Więc rozwiązaniem jest, aby mieć albo tryb pobierania jako chętny lub dołączyć do książki obiektu hibernacji sesji przy użyciu kodu podanego poniżej:

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

Opis podany powyżej jest jednym scenariuszu. Może być ich o wiele więcej. Proszę innych, żeby się nimi podzielili.

+1

To działa dla mnie naprawdę dobrze, ale nużące jest umieszczanie go wszędzie tam, gdzie jest potrzebne! – IgniteCoders

+0

@IgniteCoders Amit nie wydaje się być aktywny w SO. Czy wiesz, jakie przyczyny i przedmiot można odłączyć w jednej sesji? –

+0

@AlexanderSuraphel Naprawdę nie wiem. Po prostu umieszczam go, gdy gdzieś wyjdzie wyjątek – IgniteCoders