2009-08-06 10 views
1

Ich habe eine viele-zu-Eins-Zuordnung wie folgt aufgebaut, in der hbm.xml:many-to-one HQL Abfrage überwintern, wenn innere holen beitreten Eigenschaft nicht zugeordnet

<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 Instrumentierung, um echtes Lazy Loading zu machen.

ABER wenn ich eine hql Abfrage mit einem inneren Join fetch auf die andere Tabelle ausführen, wird die Eigenschaft, die das Objekt enthalten sollte, das den Wert der anderen Tabelle enthält, als null belassen. Obwohl ich sehen kann, dass das Objekt der anderen Tabelle durch Hibernate erstellt wird.

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> 
+0

Können Sie die eigentliche Abfrage und das 2. Mapping posten? – ChssPly76

Antwort

1

Da Sie Bytecode Instrumentierung statt Vereinigung proxying verwenden (warum?) Benötigen Sie "holen alle Eigenschaften" in der Abfrage angeben:

from Gig g fetch all properties ... 

Einzelheiten sind here

Update: Ihre gigVenue Mappingsetztbis no-proxy. Das bedeutet, dass die Eigenschaft NULL ist, bis sie über die Getter-Methode aufgerufen wird. Dies geschieht mit Byte-Code-Instrumentierung und wird nicht häufig verwendet. Die Verwendung von HQL join fetch wird eine solche Eigenschaft NICHT füllen; Sie müssen fetch all properties wie oben beschrieben explizit angeben.

Betrachten lazy="proxy" statt (das ist eigentlich der Standard für viele-zu-eins) einstellen, die Ihre Immobilie mit einem Proxy-Objekt enthält gigVenue Kennung, die während der anfänglichen wählen, dann rufen Sie die tatsächliche Einheit, wenn Sie Zugriff auf einen von GigVenue ‚initialisieren wird s Methoden. Die Verwendung von join fetch in HQL funktioniert auch in diesem Fall und ruft die vollständige GigVenue Instanz während der ersten Auswahl ab.

In diesem Sinne fetch="select" Einstellung ist auch fraglich; Es ist wahrscheinlich besser, wenn Sie die Standardeinstellung join beibehalten, um die Verwendung von Outer-Joins zum Abrufen zu aktivieren.

+0

Okay, das ist interessant. Der Grund dafür, dass wir keinen Proxy verwenden, ist, dass Eins-zu-eins immer anders abruft (nicht immer wünschenswert). So scheint es, dass für viele Eins-zu-eins-Proxy verwenden, aber für Eins-zu-eins, um wirklich faul Holen verwenden keine Proxy und Instrumentierung. – Gilgad

+0

und siehe http://stackoverflow.com/questions/965059/how-to-lazy-load-a-one-to-one-composition-via-hql für weitere Informationen. – Gilgad

+0

Uneingeschränkte eins zu eins ist ein Sonderfall. Werfen Sie einen Blick auf diese Erklärung https://www.hibernate.org/162.html, wenn Sie dies nicht bereits getan haben.Bytecode-Instrumentierung ist in der Tat die einzige Lösung in diesem Szenario, obwohl ich ehrlich gesagt noch nie einen Fall gesehen habe, bei dem die Auswahl des anderen Endes der Eins-zu-eins-Verknüpfung zu einer schrecklichen Leistung führt - diese sind immer PK-basiert. – ChssPly76

0

Die Instrumentierung beeinflusst die Abfragen und ihre Funktionsweise nicht wirklich. 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 Sie wissen der Wert ist null? ist das über den Java-Debugger oder ist das, indem Sie tatsächlich die "Get" -Methode aufrufen? Bei Instrumentierung ist das Feld normalerweise null, bis Sie tatsächlich nach dem Feld gefragt haben.

+0

Ja Ich versuche, einen ganzen Haufen von Treffern auf die Datenbank nach der ersten Abfrage zu stoppen. Und ja, ich weiß, der Wert würde von der db abgerufen werden, sobald ich den Getter aufgerufen habe, aber wie ich das Objekt bereits geholt habe (und ich kann ein Objekt dieses Typs erstellt sehen) warum schiebt es nicht einfach in der Eigenschaft bereits? – Gilgad

+0

Die Instrumentierung hat keine Auswirkungen auf Abfragen, Mappings. Ich habe meine Antwort mit einer detaillierten Erklärung aktualisiert – ChssPly76