8
votes

Touche composite hibernate

est-il nécessaire que l'identifiant de composite soit mappé en classe ??

peut-il être comme ça? p> xxx pré>

ou doit être p>

<composite-id class=....>
  <key-property=..../>
  <key-property=..../>
</composite-id>


0 commentaires

3 Réponses :


26
votes

Hibernate doit être capable de comparer et de sérialiser les identificateurs. Donc, la classe d'identifiant doit être sérialisable et la remplacement du hashcode () et est égale () de manière cohérente avec la notion de la base de données d'égalité clé composite.

Si vous avez un identifiant composite mappé comme propriétés de l'entité, l'entité elle-même est l'identifiant. p>

Une deuxième approche s'appelle un identifiant composite mappé, où les propriétés d'identification nommées à l'intérieur de la Les éléments sont dupliqués sur la classe persistante et une classe d'identifiant distincte p>

Enfin, un ID composite peut être une classe de composite. Dans ce cas, la classe des composants est la classe d'identifiant. P>

Notez qu'il est fortement recommandé d'avoir l'ID une classe distincte. Sinon, vous aurez seulement des moyens très maladroits de rechercher votre objet à l'aide de session.get () ou de session.load (). P>

sections pertinentes de la documentation de référence: p>


2 commentaires

exemple déroutant. En outre, qu'est-ce qui est "dépendant" dans l'ID composite? Voulez-vous dire «département»? de toute façon, toujours un exemple déroutant. pourrait être clarifié en ayant des commentaires pour l'expliquer.


Si vous laissez l'entité elle-même être l'identifiant, cela signifie-t-il que les égaux et le hashcode ne peuvent utiliser que les identifiants composites et les autres champs pour vérifier l'égalité?



4
votes

Les deux sont possibles. Si vous utilisez

<composite-id name="id" class="OrderLineId">
    <key-property name="lineId"/>
    <key-property name="orderId"/>
    <key-property name="customerId"/>
</composite-id>


2 commentaires

"Si vous utilisez" ... Voulez-vous mettre du code après cette ligne?


404 sur votre lien DOC.



2
votes

Si vous avez une clé composite contenant des relations avec d'autres entités, faites-le comme suit:

<composite-id>
    <key-many-to-one name="employee" column="FK_EMPLOYEE" entity-name="net.package.name.Employee" />
    <key-many-to-one name="department" column="FK_DEPARTMENT" entity-name="net.package.name.Department" />
</composite-id>


1 commentaires

Malheureusement, cela ne fonctionne pas, une exception de mappage est lancée: colonne répétée dans la cartographie pour l'entité .