Frühlings-Hibernate Mapping-Problem
-
22-09-2019 - |
Frage
Ich habe eine feder Hibernate-Anwendung, die ein Objekt versagt richtig abzubilden: im Grunde Ich habe 2 Domain-Objekte, ein Post
und ein User
. Die Semantik ist, dass jeder Beitrag hat 1 entsprechende Benutzer.
Die Post
Domain-Objekt sieht etwa wie folgt:
class Post {
private int pId;
private String attribute;
...
private User user;
//getters and setters here
}
Wie Sie sehen können, enthält Post
einen Verweis auf User
. Wenn ich ein Post
Objekt laden, möchte ich User
Objekt entspricht (träge - nur dann, wenn es gebraucht wird) geladen werden.
Meine Abbildung sieht wie folgt aus:
<class name="com...Post" table="post">
<id name="pId" column="PostId" />
<property name="attribute" column="Attribute" type="java.lang.String" />
<one-to-one name="User" fetch="join"
class="com...User"></one-to-one>
</class>
Und natürlich habe ich eine grundlegende Mapping für User
einzurichten.
Was mein Tabellenschema betrifft, so habe ich eine Tabelle post
mit einem ausländischen UserId
der Links zu der user
Tabelle genannt.
Ich dachte, das Setup funktionieren sollte, aber wenn ich eine Seite laden, dass Kräfte, die träges Laden des User
Objekt, merke ich die folgende Hiberate Abfrage generiert werden:
Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ...
Dies ist offensichtlich falsch. Es sein sollte UserId
von post
mit UserId
von user
Beitritt, sondern sie falsch Beitritt PostId
von post
(Primärschlüssel) mit UserId
von user
Irgendwelche Ideen? Dank!
Aktualisieren :
Dank ein paar der Beiträge unter ich weiß jetzt, dass ich haben sollte eine viele-zu-Eins-Abbildung statt einer Eins-zu-eins mit. Ich habe die Zuordnung unter post
der folgenden:
<many-to-one name="User" class="com...User" column="uId"/>
Aber ich habe jetzt einen Laufzeitfehler mir zu sagen, dass es kein Attribut namens uId
. Dies macht Sinn, da ich keinen uId
Spalt in meinem post
Domain-Objekt habe (ich habe einfach einen Verweis auf ein user
Objekt). Jetzt bin ich wirklich verwirrt, wie ich bekommen kann Hibernate zu erkennen, dass es die Fremdschlüssel zur Karte benötigt von der Post-Tabelle, um die Benutzertabelle. Sollte explizit ein uId
Attribut meines post
Domain-Objekt hinzufügen, ein Platzhalter für den Fremdschlüssel sein?
Ich hoffe, ich mache Sinn ...
Lösung
Da ein Benutzer viele Beiträge hat, ist der Verein in der Tat ein "many-to-one", keine "one-to-one". Es sollte funktionieren, wenn Sie es entsprechend abzubilden.
Bearbeiten : Ja, können Sie die Eigenschaft Post.user auf der Post mit einem "many-to-one" Karte oder dem Satz User.posts in Benutzern mit einem „one-to viele“oder beides. Haben Sie den Namen Ihrer Fremdschlüsselspalte angegeben?
EDIT2 : In Hibernate sprechen, eine "Säule" in der Datenbank in eine "Eigenschaft" in Ihrer Java-Klasse zugeordnet ist. Das heißt, enthält die Spalte Attribut den Namen des Fremdschlüsselspalte in der Datenbank, nicht den Namen einer Eigenschaft in Ihrer Java-Klasse. Wenn ich Ihre Frage richtig lesen, sollten Sie „Benutzer-ID“, nicht „uid“.
Oh, und ein Abruf = „Join“ kann nicht faul sein, da es vor, dass der Benutzer in derselben Abfrage wie die Post geholt wird.
Andere Tipps
Das ist das Verhalten einer Eins-zu-Eins-Abbildung. Sie teilen sich in der Regel über einen Primärschlüssel. Ruhezustand wird unter der Annahme, dass der Primärschlüssel der post teh gleiche wie der Primärschlüssel des Benutzers ist. Diese Seite fasst dieses Verhalten.
Ich vermute, dass ein Benutzer tatsächlich obwohl mehr als einen Pfosten hat. Das macht Ihren Mapping eine Eins-zu-viele.