bidirectional-relation

___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123hibernate ___ Hibernate ist eine ORM-Bibliothek (Object-Relational Mapping) für die Sprache Java, die es Entwicklern ermöglicht, POJO-artige Domänenmodelle in ihren Anwendungen zu verwenden, die weit über das Object / Relational Mapping hinausgehen. ___ tag123jpa ___ Die Java Persistence API (JPA) ist eine Java-Spezifikation für den Zugriff, die Speicherung und die Verwaltung von Daten zwischen Java-Objekten / Klassen und einer relationalen Datenbank. Es ist Teil der EJB 3.0-Spezifikation und der Industriestandard für ORM (Object to Relational Mapping). ___ qstnhdr ___ Warum Hibernate zwei Abfragen für eifrig ausführen lädt eine @OneToOne bidirektionale Assoziation? ___ tag123onetoone ___ Bezieht sich auf die Menge einer Entität als Beziehung zu einer anderen Entität. Das bedeutet, dass für jede Instanz einer Entität eine einzige verwandte Instanz einer anderen Entität vorhanden ist. ___ answer3384825 ___

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     
___ answer3382100 ___

Wie sieht Ihr Mapping genau aus?

Implementieren Ihre %code% und %code% Klassen korrekt %code% und %code% , sodass Hibernate erkennen kann, dass die %code% Instanz, auf die von %code% verwiesen wird, dieselbe Instanz der ersten %code% 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.

    
___ tag123bidirektionale Beziehung ___ hilf uns, dieses Wiki zu bearbeiten ___ qstntxt ___

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?

    
___
2
Antworten

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

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 A...
01.08.2010, 09:46