2009-09-02 9 views
9

Wo sind die häufigsten Orte, an denen Sie in Grails eine org.hibernate.LazyInitializationException bekommen haben, was war die Ursache und wie haben Sie es gelöst?Grails und Hibernates Lazy Initialization Exception

Ich denke diese eine Ausnahme kommt viel für Anfänger, also wenn Sie mehr Beispiele zur Verfügung stellen würden, würde es groß sein.

Antwort

10

Nehmen wir ein Beispiel:

class Book { 
    String title 
    Author author 
} 

class Author { 
    ... 
} 

Book book = Book.get(1) 

Wie wir wissen, Standard-Fetch-Modus in Domain-Klassen faul ist. Unter Berücksichtigung des obigen Beispiels, sagen wir, dass wir das Buchobjekt erhalten, wird das Buchobjekt automatisch an das Hibernationssitzungsobjekt angehängt, d. H. Den Cache der ersten Ebene automatisch. Und nachdem das Domain-Objekt vom Session-Objekt losgelöst wurde und wir versuchen, book.author abzuholen, löst es in diesem Moment die Lazy-Initialisierungs-Exception aus.

So ist die Lösung ist, haben entweder Modus wie eifrig holen oder Ihr Buch Objekt anhängen Sitzung mit dem Code unten in den Ruhezustand:

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

Die obige Beschreibung ist das Szenario gegeben. Es könnte viel mehr geben. Ich bitte andere, sie zu teilen.

+1

Das funktioniert für mich wirklich gut, aber es ist mühsam, es überall dort zu platzieren, wo es gebraucht wird! – IgniteCoders

+0

@IgniteCoders Amit scheint in SO nicht aktiv zu sein. Weißt du, welche Ursachen und Objekte in einer Sitzung gelöst werden? –

+0

@AlexanderSuraphel Ich weiß es wirklich nicht. Ich lege es einfach, wenn die Ausnahme irgendwo aufgeht – IgniteCoders