Les collections d'objets dépendants sont supportés (exemple: un tableau de type Name
). Déclarer la collection de composants en remplaçant le tag <element>
par le tag <composite-element>
.
<set name="someNames" table="some_names" lazy="true"> <key column="id"/> <composite-element class="eg.Name"> <!-- class attribute required --> <property name="initial"/> <property name="first"/> <property name="last"/> </composite-element> </set>
Remarque: Si vous définissez un Set
d'élément composite, il est très important d'implémenter la méthode equals()
et hashCode()
correctement.
Les élements composite peuvent aussi contenir des composants mais pas des collections. Si votre élément composite contient
aussi des composants, utilisez l'élément <nested-composite-element>
. Une collections de composants qui ccontiennent eux-mêmes des composants est un cas très exotique. A ce stade demandez-vous
si une association un-à-plusieurs ne serait pas plus approprié. Essayez de re remodeler votre élément composite comme une
entité ( Dans ce cas même si le modèle Java est le même la logique de persitence et de relation sont tout de même différentes)
Remarque, le mapping d'éléments composites ne supporte pas la nullité des propriétés lorsqu'on utilise un <set>
. Hibernate lorsqu'il supprime un objet utilise chaque colonne pour identifier un objet (on ne peut pas utiliser des clés
primaires distinctes dans une table d'éléments composites), ce qui n'est pas possible avec des valeurs nulles. Vous devez
donc choisir d'interdire la nullité des propriétés d'un élément composite ou choisir un autre type de collection comme : <list>
, <map>
, <bag>
ou <idbag>
.
Un cas particulier d'élément composite est un élément composite qui inclut un élément <many-to-one>
. Un mapping comme celui-ci vous permet d'associer les colonnes d'une table d'association plusieurs à plusieurs (many-to-many)
à la classse de l'élément composite. L'exemple suivant est une association plusieurs à plusieurs de Order
à Item
à purchaseDate
, price
et quantity
sont des propriétés de l'association.
<class name="eg.Order" .... > .... <set name="purchasedItems" table="purchase_items" lazy="true"> <key column="order_id"> <composite-element class="eg.Purchase"> <property name="purchaseDate"/> <property name="price"/> <property name="quantity"/> <many-to-one name="item" class="eg.Item"/> <!-- class attribute is optional --> </composite-element> </set> </class>
Bien sûr, il ne peut pas y avoir de référence à l'achat (purchase) depuis l'article (item), pour pouvoir naviguer de façon bidirectionnelle dans l'association. N'oubliez pas que les composants sont de type valeurs et n'autorise pas les références partagées.
Même les associations ternaires ou quaternaires sont possibles:
<class name="eg.Order" .... > .... <set name="purchasedItems" table="purchase_items" lazy="true"> <key column="order_id"> <composite-element class="eg.OrderLine"> <many-to-one name="purchaseDetails class="eg.Purchase"/> <many-to-one name="item" class="eg.Item"/> </composite-element> </set> </class>
Les éléments composites peuvent apparaître dans les requêtes en utilisant la même syntaxe que associations