Bonsoir.
Je viens à vous car j'ai un soucis de mapping one-to-one entre deux objets.
Contexte :
Je peux créer un objet A et un objet B indépendamment. Et B et A peuvent être associés en one-to-one de manière optionnelle.
One-To-One
- Ce qu'il est commun de trouver comme relation one-to-one est une association par contrainte de clé primaire. Ici, ça ne convient pas car les deux objets n'ont pas nécessairement la même clé (il me faut donc un mapping par clé étrangère).
- Ensuite, j'ai trouvé le mapping suivant, qui garantit le caractère bidirectionnel.
Code:
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
unique="true"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<one-to-one name="person"
property-ref="address"/>
</class>
Cependant, quand je prends cet exemple et que je cherche à charger un objet Adress sans Person associée, j'ai l'erreur suivante : "java.lang.IllegalArgumentException: id to load is required for loading
org.hibernate.event.LoadEvent.<init>(LoadEvent.java:51)"
J'en déduis donc que dans cette configuration, l'association est obligatoire et non optionnelle (comme le prouve not-null=true).
- Je me demande donc si la seule solution (que je n'ai pas eu le temps de tester) est l'association one-to-one bidirectionnelle par table de jointure, comme décrite sur ce site plutôt complet (
http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/reference/fr/html/associations.html) :
Code:
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<join table="PersonAddress"
optional="true">
<key column="personId"
unique="true"/>
<many-to-one name="address"
column="addressId"
not-null="true"
unique="true"/>
</join>
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
<join table="PersonAddress"
optional="true"
inverse="true">
<key column="addressId"
unique="true"/>
<many-to-one name="person"
column="personId"
not-null="true"
unique="true"/>
</join>
</class>
Qu'en pensez-vous?
Merci d'avance.