vendredi 8 janvier 2010

NHibernate et les Séquences Oracle

Bonjour, voici un nouveau billet concernant l'utilisation de NHibernate avec Oracle et .Net.

Le problème rencontré était l'utilisation d'un identifiant unique pour la création de données dans une table. Comme vous le savez peut etre déja, Oracle n'a pas de type "AUTO-INCREMENT"/"IDENTITE" comme Mysql ou SqlServeur. Pour pallier a cette contrainte il "suffit" de créer une SEQUENCE et d'utiliser cette derniere pour prendre de maniere unique l'identifiant de notre table.

Le but de ce billet n'etant pas d'expliquer les Sequence, je vous laisse la lecture de ce site pour la compréhension : http://www.commentcamarche.net/contents/oracle/oracseq.php3

Revenons a nos mouton : NHibernate est-il capable de gérer nativement les identifiants uniques ? C'est effectivement le cas ! Chouette ! Comment vous allez me dire ? C'est pas très compliqué, il suffit de modifier votre fichier de mapping comme ceci :





   
    
      SEQ_CATEGORIES      
    
    
   


Ci dessous le code de test de la création d'une catégorie

[TestMethod]
[DeploymentItem("hibernate.cfg.xml")]
public void CanCreateCategory()
{
  IRepository repo = new CategoryRepository();
  Category cat = new Category();            
  cat.Name = "ASP.NET";

  repo.Save(cat);
};

L'avantage c'est que en Oracle, NHibernate utilisera la séquence SEQ_CATEGORIES pour alimenter la table en question
SELECT SEQ_CATEGORIES.NEXTVAL FROM DUAL

Alors que si vous utiliser SQL Serveur, le parametre sera ignoré et le champs "Auto/Identité" sera utilisé.

Cependant il me reste une question avec cette méthode, c'est une fois que l'on a "sauver" notre objet categorie en BDD ... est-ce possible d'obtenir cet identifiant généré ? pour faire d'autre traitement avec ? Je pense que oui, mais pour l'instant je n'ai pas la réponse. Je vais chercher et je vous tiendrai au courant de mes résultats! Pour le coup c'est super evident et super simple :
Console.WriteLine(" Avons nous l'objet avec l'id ?: " + cat.Id);
Bon codage !

Aucun commentaire:

Enregistrer un commentaire