Frage

Ich habe eine viele zu eins-zu-Eins-Assoziationen in der HBM.xml:

<many-to-one name="gigVenue"
class="blah.blah.xxx" fetch="select"
lazy="no-proxy" not-null="true" >
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" />
</many-to-one>

Und ich verwende Instrumente, um echtes faule Laden zu machen.

Wenn ich jedoch eine HQL -Abfrage mit einem inneren Join -Fetch an die andere Tabelle ausführe, wird die Eigenschaft, die das Objekt, das den Wert der anderen Tabelle ist, enthalten sollte, als Null. Obwohl ich sehen kann, dass das Objekt des Wertes des anderen Tabellens von Hibernate erstellt wird.

Hat jemand einen Einblick in dieses Problem?

aktualisieren:

from Gig g inner join fetch g.gigVenue gv where g.artistId = :artistId and  (g.territoryId = -1 or g.territoryId = :territoryId) order by g.gigDatetime desc

<set name="gigs" inverse="true" lazy="true" table="DSP_GIG" fetch="select">
<key>
<column name="N_VENUE_ID" precision="18" scale="0" not-null="true" />
</key>
<one-to-many class="blah.blah.Gig" />
</set>
War es hilfreich?

Lösung

Da Sie Byte -Code -Instrumente anstelle von Association -Proxying verwenden (warum?) Sie müssen in Ihrer Abfrage "Alle Eigenschaften abrufen" angeben:

from Gig g fetch all properties ... 

Details sind hier

Aktualisieren: Dein gigVenue Mapping ist Einstellung lazy zu no-proxy. Dies bedeutet, dass die Eigenschaft null sein wird, bis sie erstmals über die Getter -Methode zugegriffen wird. Dies geschieht mit Byte-Code-Instrumentierung und wird häufig verwendet. Mit HQL join fetch wird eine solche Eigenschaft nicht bevölkern; Sie müssen explizit angeben fetch all properties wie ich oben beschrieben habe.

Betrachten Sie die Einstellung lazy="proxy" Stattdessen (das ist tatsächlich der Standard für viele zu eins), das Ihre Eigenschaft mit einem Proxy-Objekt initialisiert, das enthält gigVenue Bezeichner während der ersten Auswahl und dann die tatsächliche Entität abrufen, sobald Sie auf einen von zugreifen GigVenueMethoden. Verwendung join fetch In HQL wird auch in diesem Fall funktionieren und voll abrufen GigVenue Instanz während der ersten Auswahl.

In diesem Sinne, Einstellung fetch="select" ist auch fraglich; Sie sind höchstwahrscheinlich besser dran, es im Standard zu lassen join Einstellung, um die Verwendung von äußeren Verknüpfungen zum Abrufen zu aktivieren.

Andere Tipps

Die Instrumentierung wirkt sich nicht wirklich auf Abfragen und ihre Funktionsweise aus. Warum genau machst du den Abruf in der Abfrage? Versuchen Sie, die Dinge zu beschleunigen?

Und auch eine kleine Frage, nur für den Fall, wie geht es Ihnen kennt Der Wert ist null? Ist das über den Java -Debugger oder ist das, indem er tatsächlich die "GET" -Methode aufruft? Bei Instrumentierung wird das Feld normalerweise null sein, bis Sie tatsächlich nach dem Feld fragen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top