hibernate viele-zu-eins-hql-Abfrage als inner-join-fetch Eigenschaft nicht verbunden
Habe ich eine viele-zu-eine Verknüpfung einrichten wie diese, die 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 bin mit der Instrumentierung zu tun true lazy loading.
ABER wenn ich eine hql-Abfrage mit einem inner-join-fetch auf die andere Tabelle, die Eigenschaft, die enthalten sollte, das Objekt der anderen Tabelle den Wert, der übrig ist als null. Auch wenn ich sehe das andere Tabelle, die den Wert des Objekts erstellt von hibernate.
Hat jemand einen Einblick in dieses problem?
update:
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>
Kannst du die eigentliche Abfrage und der 2. mapping?
InformationsquelleAutor Gilgad | 2009-08-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie mit byte-code-Instrumentierung anstelle der Vereins-proxying (warum?) Sie müssen angeben, "fetch all "Eigenschaften" in der Abfrage:
Details sind hier
Update: Ihre
gigVenue
mapping-Einstellunglazy
zuno-proxy
. Was das bedeutet, ist, dass die Eigenschaft NULL bis zu seinem ersten Zugriff über getter-Methode. Dies geschieht mithilfe von byte-code-Instrumentierung und ist nicht etwas, das allgemein verwendet ist. Mit HQLjoin fetch
wird NICHT aufgefüllt solche Eigenschaft; Sie müssen explizit angebenfetch all properties
wie ich oben beschrieben habe.Erwägen
lazy="proxy"
statt (das ist eigentlich der Standard für viele-zu-eins -) initialisieren Sie Ihre Immobilie mit einem proxy-Objekt mitgigVenue
Bezeichner während der ersten wählen, dann rufen Sie die wirkliche Einheit, sobald Sie Zugriff auf einGigVenue
's Methoden. Mitjoin fetch
in HQL wird auch in diesem Fall, Holen Sie die volleGigVenue
Instanz während der ersten wählen.In diesem Sinne, Einstellung
fetch="select"
ist auch fraglich; Sie sind wahrscheinlich besser ab und läßt es in der Standard -join
Einstellung zum aktivieren der Verwendung von outer-joins zum abholen.und siehe auch stackoverflow.com/questions/965059/... für mehr info.
Ungezwungen one-to-one ist ein Sonderfall. Werfen Sie einen Blick auf diese Erklärung hibernate.org/162.html wenn Sie nicht bereits getan haben. Bytecode-Instrumentierung ist in der Tat die einzige Lösung in diesem Szenario, aber um ehrlich zu sein habe ich noch nie gesehen ein Fall, wo die Auswahl am anderen Ende von one-to-one association Ergebnisse in schreckliche Leistung - das sind immer die PK-basiert.
InformationsquelleAutor ChssPly76
Instrumentierung nicht wirklich beeinflussen-Abfragen und wie Sie funktionieren. Warum genau machst du die Holen in der Abfrage? Sind Sie versuchen, die Dinge zu beschleunigen?
Und auch eine kleine Frage, nur für den Fall, wie Sie wissen der Wert null ist? ist, die über den java-debugger oder ist das tatsächlich ruft die "get" - Methode? Mit der instrumentation, das Feld wird normalerweise null sein, bis Sie wirklich Fragen, für den Bereich.
Die Instrumentierung betrifft nicht Abfragen, müssen Zuordnungen. Ich aktualisiert meine Antwort mit einer ausführlichen Erklärung
InformationsquelleAutor Michael Wiles