Correspondances d'identifiant primaire

La correspondance d'identifiant primaire est obligatoire dans NHibernate. Les identifiants primaires des classes d'entité sont mis en correspondance avec les clés primaires des tables principales dans les source de données. Si vous n'en définissez aucune, une correspondance d'identifiant primaire par défaut est générée, mais risque de ne pas fonctionner correctement.

Il existe trois types de correspondance d'identifiant primaire dans NHibernate :

Les classes mises en correspondance doivent déclarer la colonne de clé primaire de la table de base de données. La plupart des classes auront également une propriété qui contiendra l'identificateur unique d'une instance.

Correspondance d'identifiant composite

Si une clé primaire inclut plusieurs colonnes, l'identifiant primaire peut avoir plusieurs attributs mis en correspondance avec ces colonnes. Dans certains cas, la colonne de clé primaire peut également être colonne de clé étrangère.



Dans l'exemple ci-dessus, la classe Assignment a un identifiant primaire doté de trois attributs : un attribut de base, et deux attributs migrés. La correspondance d'identifiant se présente comme suit :

<composite-id>
  < key-property name="Type" access="property">
    < column name="Type" sql-type="integer" 
				not-null="true"/>
  </key-property>
  <key-many-to-one name="title" access="property">
  </key-many-to-one>
  <key-many-to-one name="worker" access="property">
  </key-many-to-one>
</composite-id>

Correspondance d'identifiant primaire de composant

Pour plus de commodité, un identifiant composite peut être mis en oeuvre via une classe de type valeur séparée. L'identifiant primaire a juste un attribut ayant le type class. La classe séparée doit être définie comme classe de type valeur. La correspondance de classe de composant sera alors générée.



Dans l'exemple ci-dessous, trois attributs liés au nom sont groupés dans une classe distincte Name. Cette classe est mise en correspondance avec la même table que la classe Person. L'identifiant primaire généré se présente comme suit :

<composite-id name="name" class="identifier.Name">
  <key-property name="firstName">
    <column name="name_firstName"
    sql-type="text"/>
  </key-property>
  <key-property name="middleName">
    <column name="name_middleName" 
    sql-type="text"/>
  </key-property>
  <key-property name="lastName">
    <column name="name_lastName" 
    sql-type="text"/>
  </key-property>
</composite-id>

Remarque : La classe de type valeur doit réaliser l'interface java.io.Serializable interface, qui met en oeuvre les méthodes equals() et hashCode().