Question

J'ai une application de mise en veille prolongée ressort qui ne parvient pas à mapper un objet correctement: au fond, j'avoir 2 objets de domaine, un Post et un User. La sémantique est que chaque message a 1 utilisateur correspondant.

L'objet de domaine Post ressemble à peu près comme suit:

class Post {

  private int pId;
  private String attribute;
  ...
  private User user;

  //getters and setters here

}

Comme vous pouvez le voir, Post contient une référence à User. Quand je charge un objet Post, je veux objet User correspondant à charger (paresseusement - seulement quand elle est nécessaire).

Ma carte se présente comme suit:

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

Et bien sûr, j'ai une cartographie de base pour User mis en place.

En ce qui concerne mon schéma de la table concerne, j'ai une table appelée post avec une UserId étrangère qui lie à la table user.

Je pensais que cette configuration devrait fonctionner, mais quand je charge une page qui force le chargement paresseux de l'objet User, je remarque généré la requête Hiberate suivante:

Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ...

Il est évident que cela est faux: il devrait rejoindre UserId de post avec UserId de user, mais son PostId se joindre à tort de post (sa clé primaire) avec UserId de user

.

Toutes les idées? Merci!

Mise à jour : Merci à quelques postes ci-dessous je me rends compte maintenant que je l'ai utilisé plusieurs-à-un au lieu d'un à un. J'ai changé la cartographie sous post à ce qui suit:

<many-to-one name="User" class="com...User" column="uId"/>

Mais maintenant, je reçois une erreur d'exécution me disant qu'il n'y a pas d'attribut appelé uId. Cela est logique puisque je n'ai pas une colonne de uId dans mon objet domaine post (je simplement une référence à un objet user). Maintenant, je suis vraiment confus quant à la façon dont je peux me Hibernate pour se rendre compte qu'il a besoin de la carte clé étrangère de la table de poste à la table utilisateur. Devrait ajouter explicitement un attribut uId à mon objet de domaine post être un espace réservé pour la clé étrangère?

J'espère que je fais sens ...

Était-ce utile?

La solution

Étant donné que l'utilisateur a de nombreux messages, votre association est en fait un "many-to-one", pas un "one-to-one". Il devrait fonctionner si vous associez en conséquence.

Modifier : Oui, vous pouvez mapper la propriété Post.user sur la Poste avec un "many-to-one", ou l'ensemble User.posts dans l'utilisateur avec un « biunivoque beaucoup », ou les deux. Avez-vous spécifié le nom de votre colonne de clé étrangère?

Edit2 : En Hibernate parler, une « colonne » dans la base de données est mis en correspondance avec une « propriété » dans votre Java classe. Autrement dit, l'attribut de colonne contient le nom de votre colonne de clé étrangère dans la base de données, et non pas le nom d'une propriété dans votre classe Java. Si je lis bien compris votre question, vous devez utiliser "UserId", pas "uid".

Oh, et fetch = « join » ne peut pas être paresseux, car il exige que l'utilisateur est tiré par les cheveux dans la même requête que le poste.

Autres conseils

C'est le comportement d'un-à-un. Ils partagent généralement une clé primaire. Mise en veille prolongée est en supposant que la clé primaire de poste est Teh même que la clé primaire de l'utilisateur. Cette page résume ce comportement.

Je soupçonne qu'un utilisateur peut effectivement avoir plus d'un message bien. Cela fait le mappage un à plusieurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top