Aller au contenu

[Résolu][Hibernate] Relation one-to-one


windu.2b

Messages recommandés

bonjour à tous,

Débutant avec hibernate, je me casse les dents sur un problème sans doute tout con, mais pas pour un bleu comme moi...

Je souhaite faire une relation one-to-one entre une table SLUL et une table SLPERS, sachant que l'id de SLPERS se trouve dans le champs XPERS de la table SLUL.

Jusque là, tout va bien, mais dans les exemples que je vois concernant le one-to-one, ils disent à chaque fois que les 2 doivent avoir le même id, ce qui n'est pas du tout le cas chez moi (d'ailleurs, la requête générée à-la-volée par Hibernate a comme clause "where slpers0_.OID=? and slpers0_.OID=slul1_.OID(+)" ).

Bref, je voudrais savoir comment préciser que c'est le champ SLUL.XPERS qui est équivalent au champ SLPERS.OID

Merci :transpi:

Lien vers le commentaire
Partager sur d’autres sites

Selon la doc Hibernate :

 Il existe deux types d'associations one-to-one :
* associations par clef primaire
* association par clef étrangère unique 

Les associations par clef primaire ne nécessitent pas une colonne supplémentaire en table ; si deux lignes sont liés par l'association alors les deux lignes de la table partagent la même valeur de clef primaire. Donc si vous voulez que deux objets soient liés par une association par clef primaire, vous devez faire en sorte qu'on leur assigne la même valeur d'identifiant !

Pour une association par clef primaire, ajoutez les mappings suivants à Employee et Person, respectivement.

<one-to-one name="person" class="Person"/>
<one-to-one name="employee" class="Employee" constrained="true"/>

Maintenant, vous devez faire en sorte que les clefs primaires des lignes liées dans les tables PERSON et EMPLOYEE sont égales. On utilise une stratégie Hibernate spéciale de génération d'identifiants appelée foreign :

<class name="person" table="PERSON">
   <id name="id" column="PERSON_ID">
       <generator class="foreign">
           <param name="property">employee</param>
       </generator>
   </id>
   ...
   <one-to-one name="employee"
       class="Employee"
       constrained="true"/>
</class>

Une instance fraîchement enregistrée de Person se voit alors assignée la même valeur de clef primaire que l'instance de Employee référencée par la propriété employee de cette Person.

Alternativement, une clef étrangère avec contrainte d'unicité de Employee vers Person peut être indiquée ainsi :
<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>

Et cette association peut être rendue bidirectionnelle en ajoutant ceci au mapping de Person :
<one-to-one name"employee" class="Employee" property-ref="person"/>

(source : http://www.hibernate.org/hib_docs/referenc...ration-onetoone )

Tu as essayé cette technique ?

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta réponse...

Entre temps, je suis tombé ailleurs sur un topic où un gars recommandait de passer par un many-to-one en précisant que c'est unique (oui, je trouvais aussi que c'était bizarre, mais bon...).

Je vais étudier ta solution pour voir si ça n'est pas plus propre, mais dans tous les cas ça marche :chinois:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...