08nov. 2011

NHibernate : identity non créée lors de la création du schéma avec SchemaExport

A l'occasion de mon retour sur NHibernate j'ai du faire face à la génération du schéma de la base de données à partir de l'outil SchemaExport. Cet outil permet entre autre de transformer le mapping de vos classes en script SQL.

J'ai choisi d'utiliser les au fichier XML. Je ne voulais pas avoir une multitude de fichier hbm.xml à gérer.

Comprendre les MappingAttribute : XML over Attribute ... ou pas.

Les mapping attribute pour NHibernate sont directement issus des fichiers hbm.xml de configuration de Hibernate. Hors le concept même d'attribut (ou d'annotations en java) n'est pas prévu pour représenter une hierarchie.

Je déclare mon Id d'objet de la façon suivante :

[Id(Name = "Id", Column = "id")]
[Generator(Class = "native")]
property virtual int Id {
    ...
}

Je génère mon schéma à l'aide de SchemaExport. J'obtiens pour la ligne concernant ma clé primaire (environnement Sybase):

create table SampleTable (
    id int identity not null,
...
    primary key (id)
)

Et c'est lorsque j'ajoute une propriété que tout bascule. J'obtiens pour ma clé primaire :

create table SampleTable (
    id int not null,
...
    primary key (id)
)

Et là, c'est le drame. La clause identity a disparu.

Une question de position

SchemaExport serait-il incapable de déduire l'ordre hiérarchique des attributs ? Bingo ! Comme le dit la documentation, il faut ajouter le paramètre de position dans le mapping :

[Id(Name = "Id", Column = "id")]
[Generator(1, Class = "native")]
property virtual int Id {
    ...
}

Ma clause SQL identity réapparaît dans le SQL généré par SchemaExport.

Sources

aucun commentaire

Fil des commentaires de ce billet

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.