Warum Hibernate zwei Abfragen für eifrig ausführen lädt eine @OneToOne bidirektionale Assoziation?

8

Ich habe Entität A, die eine B-Entität hat, und B hat eine A mit @OneToOne bidirektionaler Assoziation.

Nun, wenn ich alle A-Datensätze finde, führe Hibernate zwei Abfragen mit einem linken äußeren Join auf B durch, etwa so:

%Vor%

Erste Abfrage laden A und B Felder und es ist ok, aber warum zweite Abfrage ausführen, um A neu zu laden? Ich denke, diese Abfrage lädt den A-Inhalt in B, aber dieses A ist offensichtlich das A, das B enthält ... so dass es bereits mit der ersten Abfrage geladen ist, ist nicht wahr?

- BEARBEITEN -

Entität A:

%Vor%

Entität B:

%Vor%

Das ist die Situation, und ein findAll auf A braucht zwei Abfragen ... warum?

    
blow 01.08.2010, 09:46
quelle

2 Antworten

6

Blow, wenn A und B teilen Die gleiche Primärschlüsselspalte , in der beide Entitäten mit ihrem Primärschlüssel verbunden sind, sollten Sie stattdessen verwenden %Vor%

und B Beachten Sie Sie müssen das Attribut mappedBy nicht wegen @PrimaryKeyJoinColumn

%Vor%

Lass uns testen (Du kannst testen, wenn du willst)

%Vor%

Beachten Sie, dass ich ein MutableInt-Feld ( gekapselt durch eine Integer-Eigenschaft) anstelle von Integer verwende, da Integer ein unveränderlicher Typ ist, so dass A und B die gleiche zugewiesene ID teilen

Wenn jedoch A und B mit einem anderen als ihrem Primärschlüssel verknüpft sind , sollten Sie @JoinColumn und mappedBy (bidirektionale Beziehung, rechts) wie folgt verwenden

%Vor%

Und B

%Vor%

Zum Testen

%Vor%

Wenn Sie die Eigentümerseite B verwenden, erhalten Sie Zwei SELECT-Anweisungen Es tritt auf, weil B-Tabelle keine Fremdschlüsselspalte enthält, die auf Tabelle A verweist

  

"von A a left join holen a.b wo a.id =: id"

Sie erhalten nur eine SELECT-Anweisung , weil A weiß, wie Sie die verknüpfte B-Datei mithilfe der B_ID-Fremdschlüsselspalte

abrufen können     
Arthur Ronald 02.08.2010, 03:33
quelle
0

Wie sieht Ihr Mapping genau aus?

Implementieren Ihre A und B Klassen korrekt hashCode() und equals() , sodass Hibernate erkennen kann, dass die A Instanz, auf die von B verwiesen wird, dieselbe Instanz der ersten A ist?

Klingt so, als würden Sie versuchen, ein bidirektionales Eins-zu-eins-Mapping zu modellieren - werfen Sie einen Blick auf den Abschnitt im Handbuch zu diesem um die empfohlenen Methoden zu sehen, um es zu erreichen.

    
matt b 01.08.2010 12:57
quelle