Ich habe eine Instanz einer Klasse, die ich aus einer Hibernate-Sitzung erhalten habe. Diese Sitzung ist lange vorbei. Jetzt rufe ich toString()
an und ich bekomme die erwartete LazyInitializationException: could not initialize proxy - no Session
, da ich versuche, auf eine Referenz zuzugreifen, die Hibernate beim Laden der Instanz nicht aufgelöst hat (Lazy Loading).Wie implementiere ich toString() in einer Klasse, die Hibernate zugeordnet ist?
Ich möchte nicht wirklich das Laden eifrig machen, da es die Abfrage von ungefähr 120 Zeichen zu über 4KB (mit acht Joins) ändern würde. Und ich muss nicht: Alles, was ich in toString()
anzeigen möchte, ist die ID des referenzierten Objekts; d. h. etwas, das Hibernate zu diesem Zeitpunkt wissen muss (oder das lazy loading nicht ausführen kann).
Also meine Frage: Wie gehst du mit diesem Fall um? Versuchen Sie nie Referenzen in toString()
zu verwenden? Oder rufst du toString()
im Ladecode an, nur für den Fall? Oder gibt es eine Utility-Funktion in Hibernate, die etwas nützliches zurückgibt, wenn ich eine Referenz übergebe, die könnte faul sein? Oder vermeiden Sie Referenzen in toString()
insgesamt?
Wenn Java hatte Verschluss Sie tun könnten: String x = lazyToString ({=> this.getY()}) + lazyToString ({=> this.getZ()}); und fangen Sie die Expect in der LazyToString-Methode. Der Overhead mit inneren Klassen (oder try/catch) ist zu hoch, um dies zu tun. –
Ja, aber das würde mir auch keine Sitzung geben. –
Das stimmt. Sie können dann nur drucken, dass der Wert nicht geladen ist. Ich dachte, das war die Absicht. Sie können keine Sitzung starten und das Objekt dem Aufruf der toString-Methode zuordnen. –