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 und B Beachten Sie Sie müssen das Attribut mappedBy nicht wegen @PrimaryKeyJoinColumn Lass uns testen (Du kannst testen, wenn du willst) 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 Und B Zum Testen 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
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.
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?