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 ...

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top