Java PersistenceN2TR

19
Chapitre12 : La persistance dans JAVA Riadh Bouhouchi 1 1 MASTER PROFESSIONNEL NOUVELLES TECHNOLOGIES DES TELECOMMUNICATIONS ET RESEAUX (N2TR) Cours J2EE © UVT La persistance dans JAVA Objectif : Ce chapitre vous permettra de comprendre les principes de persistance dans java, tel que le mapping d’objet relationnel, les requêtes d’entités, les Callbacks et les Listeners, qu’on va appliquer dans quelques exemples.

description

Java PersistenceN2TR

Transcript of Java PersistenceN2TR

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    1 1

    MASTER PROFESSIONNEL NOUVELLES TECHNOLOGIES DES TELECOMMUNICATIONS ET RESEAUX

    (N2TR)

    Cours J2EE UVT La persistance dans JAVA

    Objectif : Ce chapitre vous permettra de comprendre les principes de persistance dans java, tel que le mapping dobjet relationnel, les requtes dentits, les Callbacks et les Listeners, quon va appliquer dans quelques exemples.

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    2 2

    Sommaire

    Vue densemble sur les spcifications du JPA ........................................................................................... 3

    Comprendre les entits ............................................................................................................................ 3

    Le mapping objet-relationnel ................................................................................................................... 3

    Entits dinterrogation ............................................................................................................................. 4

    Rappels et Auditeurs (Callbacks and Listeners) ......................................................................................... 7

    Assembler le tout ensemble : ................................................................................................................... 8

    La rdaction de lentit Book : ................................................................................................................. 8

    Rdaction de la classe principale Main : .............................................................................................. 9

    Unit de la persistance pour la classe principale Main : .................................................................... 10

    La compilation avec Maven : .................................................................................................................. 11

    L'excution de la classe principale avec Derby : ...................................................................................... 14

    La rdaction de la classe BookTest : ....................................................................................................... 16

    Unit de persistance pour la classe BookTest : ....................................................................................... 18

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    3 3

    Vue densemble sur les spcifications du JPA JPA 1.0 a t cr avec Java EE 5 afin de rsoudre le problme de la persistance des donnes. Elle propose des modles orients objet et relationnelles ensemble. JPA est une abstraction du JDBC qui permet d'tre indpendant de SQL. Toutes les catgories et les annotations de cette API sont dans le package javax.persistence. Les principales composantes de cette API sont comme suit:

    ORM, qui est le mcanisme de mapping d'objets des donnes stockes dans une base de donnes relationnelle.

    Un gestionnaire d'entits API pour effectuer des oprations sur les bases de donnes, telles que la cration, la lecture, la mise jour, la suppression (CRUD) des donnes. Cette API vous permet d'viter d'utiliser l'API JDBC directement.

    La Java Persistence Query Language (JPQL), qui vous permet de rcuprer les donnes avec un langage de requte orient objet.

    Les transactions et les mcanismes de verrouillage de l'accs aux donnes en mme temps fourni par lAPI Java Transaction (JTA).

    Comprendre les entits Lorsquon parle du mapping des objets d'une base de donnes relationnelle, la persistance des objets, ou l'interrogation des objets, le terme entit devrait tre utilis plutt que le terme objets. Les objets sont des instances qui viennent de vivre dans la mmoire. Les entits sont des objets qui vivent peu de temps dans la mmoire et de faon persistante dans une base de donnes. Ils ont la capacit d'tre relis une base de donnes, et peuvent tre concrets ou abstraits. Ils prennent en charges l'hritage, les relations, et ainsi de suite. Ces entits, une fois mappes, peut tre gr par le JPA. Vous pouvez persister, une entit dans la base de donnes, la supprimer et l'interroger en utilisant un langage de requte (Java Persistence Query Language, ou JQPL).

    Le mapping objet-relationnel Le principe de l'ORM est de dlguer des outils externes ou des frameworks (le JPA dans notre cas) la tche de crer une correspondance entre les objets et les tableaux. Le monde des classes, des objets et attributs peuvent tre mapps des bases de donnes relationnelles en tableaux contenant des lignes et des colonnes. Le mapping donne une vue oriente objet pour les dveloppeurs qui peut de manire transparente l'utilisation des entits au lieu des tables. Mais comment le JPA mappe les objets une base de donnes? Cest avec des mtadonnes, chaque mtadonne est associe une entit qui dcrit le mapping. Ces mtadonnes permettent au fournisseur de persistance de reconnatre une entit et d'interprter le mapping.

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    4 4

    Cette mtadonne peut tre rdige en deux formats diffrents: Annotations: Le code de l'entit est directement annot avec toutes sortes d'annotations

    qui sont dcrits dans le dossier javax.persistence. Les descripteurs XML: au lieu de (ou en plus) les annotations, vous pouvez utiliser les

    descripteurs XML. Le mapping est dfinie dans un fichier XML externe qui sera dploy avec lentit. Cela peut tre trs utile lors de changements de configuration de base de donnes en fonction de l'environnement, par exemple.

    Pour rendre plus facile le mapping, le JPA (comme beaucoup d'autres spcifications Java EE 6) utilise le concept de configuration par exception (parfois appel programmation par exception). L'ide est que le JPA a certaines rgles de mappage par dfaut (par exemple, le nom du tableau est le mme que le Nom de l'entit). Si vous tes satisfait, vous n'avez pas besoin d'utiliser des mtadonnes supplmentaires (aucune annotation ou XML est ncessaire), mais si vous ne voulez pas que le fournisseur applique les rgles par dfaut, vous pouvez personnaliser le mapping vos propres besoins en utilisant des mtadonnes. En d'autres termes, d'avoir fournir une configuration est l'exception la rgle.

    Donc, nous allons voir comment cela s'applique une entit :

    Book

    Id :Long

    Title :String

    Price :float

    Description :String

    nbOfPage:integer

    illustrations:

    Boolean

    figure 2-1 montre une entit book avec quelques attributs.

    Comme vous pouvez le voir, certains d'entre eux sont annots (id, titre et description), et certains ne le sont pas.

    Entits dinterrogation Le JPA permet de mapper les entits aux bases de donnes et aussi de les interroger l'aide de diffrents critres. La puissance du JPA cest qu'il offre la possibilit dinterroger des entits de leurs relations dans un chemin oriente objet sans avoir utiliser les cls trangres de la base de donnes ou des colonnes.

    Book

    ID begint Nullable=false

    Title

    Price

    Description

    Isbn

    NBOFPAGE

    ILLUSTRARATION

    Varchar(255) Double Varchar(2000) Varchar(250) Integer Smallint

    Nullable=false

    Nullable=true Nullable=true Nullable=true Nullable=true Nullable=true

    mapping

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    5 5

    La partie responsable de l'API pour orchestrer les entits est le gestionnaire d'entits. Son rle est la gestion des entits, lire et crire dans une base de donnes, et de permettre des oprations simples (CRUD) sur les entits ainsi que des requtes complexes en utilisant JPQL. Dans un sens technique, le gestionnaire d'entits est juste une interface dont l'application est faite par le fournisseur de persistance, EclipseLink.

    Ce bout de code montre comment crer un gestionnaire d'entits et de persister une entit Book:

    Main

    Figure 2-2. Le gestionnaire d'entits en interaction avec l'entit et la base de donnes sous-jacentes.

    Dans la figure 2-2, vous pouvez voir comment l'interface EntityManager peut tre utilise par une classe pour manipuler les entits (dans ce cas, Book). Avec des mthodes telles que persist () et find (), les gestionnaires d'entits cachent le JDBC de la base de donnes et l'instruction INSERT ou SELECT du langage SQL.

    EntityManager

    Persist(entity :Object) :void

    Find(entityClass, :Class,primaryKey :Object) :

    Book

    Id :Long

    Title :String

    Price :float

    Description :String

    nbOfPage:integer

    illustrations:

    Boolean

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("chapter02PU"); EntityManager em = emf.createEntityManager(); em.persist(book);

    SQL/JDBC

    DataBase

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    6 6

    Le gestionnaire d'entits vous permet galement dinterroger (effectuer des requtes) les entits. Une requte dans ce cas est similaire une interrogation de la base de donnes, sauf qu'au lieu d'utiliser SQL, les requtes JPA appliqus aux entits utilisent le JPQL. Sa syntaxe utilise l'objet dannotation familire point (.). Pour rcuprer tous les books qui ont le titre de H2G2, vous pouvez crire le code suivant:

    Une dclaration JPQL peut tre excut avec des requtes dynamiques (cr dynamiquement l'excution), des requtes statiques (dfinies statiquement lors de la compilation), ou mme avec une dclaration SQL natif. La requte statique, galement connu sous le nom des requtes nommes, sont dfinies en utilisant soit des annotations soit, des mtadonnes XML. La dclaration prcdente JPQL peut, par exemple, tre dfinie comme une requte nomme sur l'entit book. La figure 2-2 montre une entit Book dfinir la requte findBookByTitle nomm en utilisant lannotation

    @NamedQuery. La requte findBookByTitle Named

    SELECT b FROM Book b WHERE b.title = 'H2G2'

    @Entity @NamedQuery(name = "findBookByTitle", query = "SELECT b FROM Book b WHERE b.title ='H2G2'")

    public class Book { @Id @GeneratedValue private Long id; @Column(nullable = false) private String title; private Float price; @Column(length = 2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations; // Constructors, getters, setters }

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    7 7

    Rappels et Auditeurs (Callbacks and Listeners)

    Les entits sont simples des Plain (pleine) Old (ancienne) Java Object (POJO) qui sont, ou qui ne sont pas gres, par le gestionnaire d'entits. Ils sont grs, quand tils ont une identit persistance, et leur tat est synchronis avec la base de donnes, et quand ils ne le sont pas (c'est dire qu'ils sont dtachs du gestionnaire d'entits), ils peuvent tre utilises comme n'importe quelle autre classe Java. Cela signifie que les entits ont un cycle de vie, comme montre la figure 2-3.

    Figure 2-3. Le cycle de vie d'une entit

    Lorsque vous crez une instance de l'entit book avec le nouvel oprateur, lobjet existe dans la mmoire, et le JPA ne sait rien ce sujet. Quand il devient gr par le gestionnaire d'entits, son tat est mapp et synchronis la table des books. L'appel de la mthode EntityManager.remove () supprime les donnes de la base de donnes, mais l'objet Java continue vivre dans la mmoire jusqu' ce qu'il soit rcuprer par le ramasse-miettes. Les oprations effectues des entits se rpartissent en quatre catgories: la persistance, la mise jour, la suppression, et le chargement, qui correspondent respectivement l'insertion, la mise jour, la suppression et la slection dans la base de donnes. Chaque opration a un pr "et" Post "vnement (sauf pour le chargement, ce qui a seulement un "Post" vnement) qui peut tre intercepte par le gestionnaire d'entits invoquer une mthode mtier. Vous pouvez penser des mthodes de rappel et les auditeurs comme analogue dclenche dans une base de donnes relationnelle.

    Exists in memory

    Detached Managed Removed

    DataBase

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    8 8

    Assembler le tout ensemble :

    Maintenant que vous savez un peu plus sur le JPA, EclipseLink, les entits, le gestionnaire d'entits, et le JPQL, mettons tout ensemble et crivons une petite application qui persiste une entit dans une base de donnes.

    L'ide est d'crire un book avec une entit simple et une classe principale qui persiste un book.

    Vous pourrez ensuite ltablir avec Maven 2 et l'excuter avec EclipseLink et une base de

    donnes client Derby.

    Pour montrer avec que cest facile dunir un test a une entit, je vais vous montrer comment crire une classe de test (BookTest) avec JUnit 4 testnet utiliser le mode intgr de Derby pour la persistance des donnes en utilisant une base de donnes. Cet exemple suit la structure de rpertoire Maven, alors les classes et les fichiers doivent tre placs dans les rpertoires suivants:

    src / main / java: Pour l'entit du book et de la classe principale

    src / main / resources: Pour le persistence.xml fichier utilis par la classe principale

    src / test / java: Pour la classe BookTest, qui est utilis pour les tests unitaires

    src / test / resources: Pour le persistence.xml fichier utilis par les cas de test

    pom.xml: Pour le modle Maven Project Object (POM), qui dcrit le projet et ses dpendances sur d'autres modules externes et des composants

    La rdaction de lentit Book :

    L'entit book, illustr dans la figure 2-3, doit tre dvelopp sous le rpertoire src / java main /. Elle a plusieurs attributs (titre, prix, etc.), diffrents types de donnes (String, Char, Entier, et Boolean) et quelques annotations JPA:

    @ Entity informe le fournisseur de persistance que cette classe est une entit et qu'il devrait le grer.

    @ Id dfinit l'attribut id comme tant la cl primaire.

    L'annotation @ GeneratedValue informe le fournisseur de persistance pour gnrer automatiquement la cl primaire en utilisant la base de donnes sous-jacentes d'utilit id.

    L'annotation @ Column est utilise pour spcifier que le titre de proprit doit tre non nulle, quand persist et de changer la longueur maximale par dfaut de la colonne description.

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    9 9

    L'annotation @ NamedQuery dfinit une requte nomme qui utilise JPQL pour rcuprer toutes les books de la base de donnes.

    Rdaction de la classe principale Main :

    La classe principale, dans la figure 2-4, est sous le mme rpertoire que l'entit book. Elle commence en crant une nouvelle instance de l'entit book (en utilisant le nouveau mot-cl Java) et dfinit certaines valeurs ses attributs. Il n'y a rien de spcial ici, juste du pur code Java. Il utilise ensuite la classe de persistance pour obtenir une instance d'un EntityManagerFactory qui fait rfrence une persistance unit appele chapter02PU, quon va dcrire plus loin dans la section Persistance Unit pour la classe principale Cette EntityManagerFactory cre une instance d'un EntityManager . Tel que mentionn prcdemment, le gestionnaire d'entits est la pice centrale du JPA capable de crer une transaction, qui persistent lobjet book l'aide de la mthode EntityManager.persist (), puis de valider la transaction. la fin de la mthode main (), l'EntityManager et EntityManagerFactory sont ferm en mme temps la fois pour librer les ressources du fournisseur.

    package com.apress.javaee6.chapter02; @Entity @NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book b") public class Book { @Id @GeneratedValue private Long id; @Column(nullable = false) private String title; private Float price; @Column(length = 2000) private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations; // Constructors, getters, setters }

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    10 10

    Unit de la persistance pour la classe principale Main : Comme vous pouvez le voir dans la classe principale, le EntityManagerFactory a besoin d'une unit

    appele persistance chapter02PU. Cette unit de persistance doit tre dfini dans le fichier

    persistence.xml dans le rpertoire src / main / resources / rpertoire META-INF (voir Exemple 2-5). Ce

    fichier, requis par la spcification JPA, est important car il relie le fournisseur du JPA (EclipseLink dans

    notre cas) la base de donnes (Derby).Il contient toutes les informations ncessaires pour se connecter

    la base de donnes (target, URL, pilote JDBC, utilisateur et mot de passe) et en informe le fournisseur

    de la base de donnes en mode gnration (un moyen de crer des tables s'ils n'existent pas).

    package com.apress.javaee6.chapter02; public class Main { public static void main(String[] args) { // Creates an instance of book Book book = new Book(); book.setTitle("The Hitchhiker's Guide to the Galaxy"); book.setPrice(12.5F); Chapter 50 2 JAVA PER SISTE NCE book.setDescription("Science fiction comedy book"); book.setIsbn("1-84023-742-2"); book.setNbOfPage(354); book.setIllustrations(false); // Gets an entity manager and a transaction EntityManagerFactory emf = Persistence.createEntityManagerFactory("chapter02PU"); EntityManager em = emf.createEntityManager(); // Persists the book to the database EntityTransaction tx = em.getTransaction(); tx.begin(); em.persist(book); tx.commit(); em.close(); emf.close(); } }

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    11 11

    L'lment dfinit le fournisseur de persistance, dans notre cas, EclipseLink.

    Cette unit de persistance liste toutes les entits qui doivent tre grs par le gestionnaire d'entits .Ici, le tag se rfre l'entit book.

    La compilation avec Maven :

    Vous avez tous les ingrdients pour excuter l'application: l'entit book que vous avez besoin de persister, la classe principale, qui utilise un gestionnaire d'entits, et l'unit de persistance contraignant l'entit la base de donnes Derby. Pour compiler ce code, au lieu d'utiliser la commande du compilateur javac directement, vous allez utiliser Maven.

    org.eclipse.persistence.jpa.PersistenceProvider com.apress.javaee6.chapter02.Book

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    12 12

    Vous devez d'abord crer un fichier pom.xml qui dcrit le projet et ses dpendances telles que l'API JPA. Vous devez galement informer Maven que vous utilisez Java SE 6 en configurant le maven-compiler-plugin.

    4.0.0 com.apress.javaee6 chapter02 1.0 chapter02 org.eclipse.persistence javax.persistence 1.1.0 org.eclipse.persistence eclipselink 1.1.0 org.apache.derby Chapter 52 2 JAVA PER SISTE NCE derbyclient

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    13 13

    10.4.2.0 org.apache.derby derby 10.4.2.0 test junit junit 4.5 test org.apache.maven.plugins maven-compiler-plugin true 1.6 1.6

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    14 14

    Tout d'abord, pour pouvoir compiler le code, vous avez besoin de l'API JPA qui dfinit l'ensemble des annotations et des classes qui sont dans le package javax.persistence. Vous obtiendrez ces classes dans le JAR dans javax.persistence artefact ID et stockes dans le rfrentiel Maven. Le runtime EclipseLink (le fournisseur de persistance) est dfini dans l'artefact eclipselink ID. Vous avez besoin ensuite des pilotes JDBC pour se connecter Derby. L'artefact derbyclient ID se rfre la JAR qui contient le pilote JDBC pour se connecter Derby en mode serveur et l'artefact derby ID contient les classes pour utiliser une base de donnes embarque Derby. Notez que cet artefact ID est porte pour les essais ( test champ d'application) et a une dpendance sur JUnit 4. Pour compiler les classes, il faut ouvrir un interprteur de commande en ligne dans le rpertoire racine qui contient le fichier pom.xml et entrer la commande Maven suivante: mvn compile. Vous devriez voir le message BUILD SUCCESSFUL vous informer que la compilation a t couronne de succs. Maven cre un sous-rpertoire cible avec tous les fichiers de classe ainsi que les fichiers de persistance.

    L'excution de la classe principale avec Derby : Avant d'excuter la classe principale, vous devez lancer Derby. La meilleure faon de faire est d'aller dans le rpertoire% DERBY_HOME \ bin% et excuter le script startNetworkServer.bat. Derby dmarre et affiche les messages suivants dans la console:

    Le processus de Derby est l'coute sur le port 1527 et attend le pilote JDBC pour envoyer des

    instructions SQL. Pour excuter la classe principale, vous pouvez utiliser la commande de linterprteur

    Java ou utiliser Maven comme suit:

    Lorsque vous excutez la classe principale, plusieurs choses se produisent. Tout d'abord, Derby

    cre automatiquement la base de donnes chapter02DB et l'entit book est initialise. C'est parce que

    dans le fichier persistence.xml vous avez ajout la proprit create = true l'URL JDBC:

    Security manager installed using the Basic server security policy. Apache Derby Network Server - 10.4.2.0 - (689064) started and ready to accept connections on port 1527

    mvn exec:java -Dexec.mainClass="com.apress.javaee6.chapter02.Main"

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    15 15

    Ce raccourci est trs utile lorsque vous tes en mode de dveloppement, vous n'avez pas besoin de

    script SQL pour crer la base de donnes. Ensuite, la proprit eclipselink.ddl gnration informe

    EclipseLink pour crer automatiquement la table des books. Enfin, le book est insr dans le tableau

    (Avec un ID gnr automatiquement).

    Utilisons la console de commande Derby pour afficher la structure de la table: entrez la commande ij dans une console (%% DERBY_HOME \ bin doit tre dans votre variable PATH). Il sera interprte par Derby, et vous pouvez excuter des commandes pour se connecter la base de donnes, afficher les tables de la base de donnes chapter02DB (tableaux montrent), vrifier la structure de la table BOOK (dcrire book), et mme montrer son contenu en entrant les requtes SQL telles que SELECT * FROM books.

    em.persist(book);

    C:\> ij version ij 10.4 ij> connect 'jdbc:derby://localhost:1527/chapter02DB'; ij> show tables; TABLE_SCHEM |TABLE_NAME |REMARKS ------------------------------------------------------------------------

    APP |BOOK | APP |SEQUENCE | Chapter 54 2 JAVA PER SISTE NCE ij> describe book; COLUMN_NAME |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL& ------------------------------------------------------------------------

    ID |BIGINT |0 |10 |19 |NULL |NULL |NO TITLE |VARCHAR |NULL|NULL|255 |NULL |510 |NO PRICE |DOUBLE |NULL|2 |52 |NULL |NULL |YES ILLUSTRATIONS |SMALLINT |0 |10 |5 |0 |NULL |YES DESCRIPTION |VARCHAR |NULL|NULL|2000 |NULL |4000 |YES ISBN |VARCHAR |NULL|NULL|255 |NULL |510 |YES NBOFPAGE |INTEGER |0 |10 |10 |NULL |NULL |YES

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    16 16

    Pour en revenir au code de l'entit de books, parce que vous avez utilis le GeneratedValue annotation (pour gnrer automatiquement lID), EclipseLink a cr une table pour stocker des squences de numrotation (le tableau de squence). Pour la structure de la table BOOK, le JPA a suivi certaines conventions par dfaut comme le nom de la table et les colonnes aprs le nom de l'entit et les attributs. L'annotation @ Column a annul certaines de ces valeurs par dfaut tels que la longueur de la colonne de description, qui est fix 2000.

    La rdaction de la classe BookTest : C'est ainsi que vous allez excuter notre classe BookTest, en utilisant le mode incorpor de Derby. Maven utilise deux rpertoires diffrents, l'un pour stocker le code de l'application principale et lautre pour les classes de tests. La classe BookTest, passe sous le rpertoire src / test / java et test qui le gestionnaire d'entits peuvent persister un book et le rcuprer de la base de donnes.

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    17 17

    public class BookTest { private static EntityManagerFactory emf; private static EntityManager em; private static EntityTransaction tx; @BeforeClass

    public static void initEntityManager() throws Exception { emf = Persistence.createEntityManagerFactory("chapter02PU"); em = emf.createEntityManager(); } @AfterClass public static void closeEntityManager() throws SQLException { em.close(); emf.close(); } @Before public void initTransaction() { tx = em.getTransaction(); } @Test public void createBook() throws Exception { // Creates an instance of book Book book = new Book(); book.setTitle("The Hitchhiker's Guide to the Galaxy"); book.setPrice(12.5F); book.setDescription("Science fiction comedy book"); book.setIsbn("1-84023-742-2"); book.setNbOfPage(354); book.setIllustrations(false); // Persists the book to the database tx.begin(); em.persist(book); tx.commit(); assertNotNull("ID should not be null", book.getId()); // Retrieves all the books from the database List books = em.createNamedQuery("findAllBooks").getResultList(); assertNotNull(books); } }

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    18 18

    Comme la classe principale, BookTest a besoin de crer une instance EntityManager l'aide d'un

    EntityManagerFactory.

    Pour initialiser ces composants, vous pouvez utiliser le JUnit 4 fixtures.

    Le @BeforeClass Et @AfterClass annotations permettent lexcution de certains de codes une seule fois,

    avant et aprs que la classe soit excute. C'est l'endroit idal pour crer et fermer un EntityManager

    par exemple. L'annotation @ Avant vous permet d'excuter du code avant chaque test, qui obtient une

    transaction.

    Le createBook () est le scnario de test, il est annot avec l'annotation JUnit @ Test.

    Cette mthode persiste un book (en utilisant la mthode EntityManager.persist ()) et contrle si l'id a t

    gnr automatiquement par EclipseLink (avec assertNotNull). Si c'est le cas, la requte nomme

    findAllBooks est excute et elle vrifie si la liste retourne est nulle.

    Unit de persistance pour la classe BookTest : Maintenant que la classe de test est crite, vous avez besoin d'un autre fichier persistence.xml utiliser avec Derby embarqus. Le fichier prcdent persistence.xml dfinit le pilote JDBC et une connexion Web pour le serveur Derby, qui doit tre lanc dans un processus spar. Le src / test / resources / META-INF /

    org.eclipse.persistence.jpa.PersistenceProvider com.apress.javaee6.chapter02.Book

  • Chapitre12 : La persistance dans JAVA

    Riadh Bouhouchi

    19 19

    Il ya d'autres changements entre les fichiers persistence.xml. Par exemple, la gnration DDL est

    la suppression et la cration des tables au lieu de crer des tables, pour tester des tables supprimer et

    recrer si vous avez une nouvelle structure de base de donnes. Notez galement que le

    niveau d'enregistrement est FINE au lieu de INFO . Encore une fois, c'est bon pour les essais,

    comme vous pouvez obtenir de plus amples renseignements au cas o quelque chose tournerait mal.

    L'excution de la classe BookTest avec Embedded Derby. Rien n'est plus facile que l'excution du test:

    vous pouvez compter sur Maven.

    Ouvrez une console dans le rpertoire o se trouve le fichier pom.xml et entrez la commande suivante:

    Maven nous informe du rsultat :

    mvn test

    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ---------------------------------------------------------------- [INFO] BUILD SUCCESSFUL [INFO] ---------------------------------------------------------------- [INFO] Total time: 19 seconds [INFO] Finished [INFO] Final Memory: 4M/14M [INFO] ----------------------------------------------------------------