Plus de JPA : generer les PKs, etc…

Java Persistence API permet d’utiliser plusieurs mecanismes pour generer des cles primaires des tables et ceci au moyen d’une simple declaration (Annotations ou fichier XML). La cle primaire peut ainsi etre :

  • Une sequence generee par la base de donnees si celle-ci le permet (Oracle, par exemple)
  • Une colonne identite si la base de donnees le permet (SQL Server, par exemple)
  • Une valeur stockee dans une ligne d’une table
  • Une methode automatique geree par l’API. Dans ce dernier cas, il faut utiliser la generation automatique du schema pour que les structures correspondantes puissent etre creees.

Pour en savoir plus sur ces methodes, il existe un document « howto » sur le site dedie a Toplink Essentials, ici ainsi qu’un second document qui illustre comment effectuer des insert-update-delete avec JPA ici.

La troisieme methode, qui s’appuie sur une table, est generalement possible avec toutes les bases de donnees; Je vais continuer le thread precedent et la mettre en oeuvre avec Derby. Pour cela, il faut utiliser 2 annotations :

  • javax.persistence.GeneratedValue se situe generalement apres l’annotation javax.persistence.Id. Elle indique que la valeur de la cle doit etre generee ainsi que la methode associee. Pour une table, la maniere la plus simple est de donner un nom a la methode de generation. Par exemple :
    @GeneratedValue(generator= »monGen4EmpPk »)
  • javax.persistence.TableGenerator se situe generalement en dessous de l’annotation precedente et contient les attributs suivants : (1) name est le nom du generateur, (2) table est le nom de la table dans laquelle la valeur de cle est stockee, (3) pkColumnName est le nom de la colonne qui contient le nom du compteur, (4) valueColumnName est le nom de la colonne qui contient le compteur de la cle et (5) pkColumnValue est la valeur pour la colonne definie precedemment et correspond a la ligne du compteur. Par exemple, on trouvera l’annotation suivante :
    @TableGenerator(name= »monGen4EmpPk »,
    table= »TABSEQ »,
    pkColumnName= »ID_TABSEQ »,
    valueColumnName= »VAL_TABSEQ »,
    pkColumnValue= »SEQEMP »)

Dans le cas illustre precedemment, pour initialiser la base de donnees, on pourra creer une table TABSEQ(ID_TABSEQ VARCHAR(10), VAL_TABSEQ INT) puis inserer une ligne avec les valeurs SEQEMP et 1. Avec une base Derby, cela signifie, qu’il faut executer le code suivant sur Derby :
TABSEQ values (‘SEQEMP’, 5);

Si on reprend maintenant notre classe persistente Emp et qu’on la manipule sans positionner d’identifiant, on constate que c’est l’API de persistence Java qui positionne les valeurs en s’appuyant sur la table parametree ci-dessus. Vous pouvez recuperer le projet JDeveloper qui reprend l’exemple complet sur mon repertoire internet en cliquant sur le lien suivant.

Pour terminer cet exemple, vous trouverez plus d’informations dans de nombreux documents, et en particulier :

Reste a continuer… Encore !

GarK!

2 réflexions sur “Plus de JPA : generer les PKs, etc…”

  1. Il ne faut pas raisonner relationnel, mais objet ! C’est le mapping O-R qui fait ce travail et pas ton code

    Ça dépend de ton modèle ! Prenons par exemple un objet qui a une propriété de type « List » d’un autre objet, ajouter d’objet dans la « List » de l’instance qui représente le parent alimentera la FK. C’est pour ça (entre autre) que tu fais un Mapping O-R. Quand tu manipules les objets, tu ne dois pas faire référence au modèle relationnel.

  2. Bonjour,
    Une petite question: Comment fait on pour récupérer la pk d’une table « maitresse » pour l’insérer dans le champ fk d’une table « esclave »??
    Julien.

Les commentaires sont fermés.