GLG203 - TP13 T P1 3 Pasc al GRA FFIO N 2011 /06/2 8 16:1 3 Table des matières TP 13 - Persistence avec JPA .................................................................................................................................................................................................... Hello PetStore ! ............................................................................................................................................................................................................................ Page 1 - dernière modification par Pascal GRAFFION le 2011/06/28 16:13 GLG203 - TP13 Entity manager ........................................................................................................................................................................................................................... Expression des besoins ................................................................................................................................................................................................................ Analyse et conception ................................................................................................................................................................................................................... Vue logique .................................................................................................................................................................................................................................... Vue processus .............................................................................................................................................................................................................................. Vue implémentation .................................................................................................................................................................................................................... Architecture ................................................................................................................................................................................................................................. Vue déploiement .......................................................................................................................................................................................................................... Implémentation ................................................................................................................................................................................................................................ Recette utilisateur ........................................................................................................................................................................................................................... Résumé .............................................................................................................................................................................................................................................. Références ........................................................................................................................................................................................................................................ TP 13 - Persistence avec JPA La persistance des données en EJB 3 a été complètement réarchitecturée au travers de JPA (Java Persistence API). Alors que nous parlions de composants persistants en EJB 2.x, JPA se recentre sur de simples classes Java. En EJB 2.x la persistance ne pouvait être assurée qu’à l’intérieur du conteneur alors qu’avec JPA elle peut être utilisée dans une simple application JSE (Java Standard Edition). Hello PetStore ! Dans le modèle de persistance JPA, un entity bean est une classe java simple (un Pojo) complétée par de simples annotations : @Entity // 1 public class Book { @Id // 2 private Long id; @Column(nullable = false) // 3 private String title; private Float price; @Column(length = 2000) // 3 private String description; private String isbn; // ... Notez la présence d’annotations à plusieurs endroits dans la classe Book : 1. 1. 1. tout d’abord, l’annotation @javax.persistence.Entity permet à JPA de reconnaître cette classe comme une classe persistante et non comme une simple classe Java. L’annotation @javax.persistence.Id, quant à elle, définit l’identifiant unique de l’objet. Elle donne à l’entity bean une identité en mémoire en tant qu’objet, et en base de données via une clé primaire. Les autres attributs (description, isbn, ...) seront rendus persistants par JPA en appliquant les paramétrages par défaut : le nom de la colonne est identique à celui de l’attribut et le type String est converti en varchar(255). L’annotation @javax.persistence.Column permet de préciser des informations sur une colonne de la table : changer son nom (qui par défaut porte le même nom que l’attribut), préciser son type, sa taille et si la colonne autorise ou non la valeur null. Entity manager Quand on veut rendre persistent en base de données un entity bean (ou une entité), il faut utiliser un entity manager. Il est logique d’encapsuler cet entity manager dans un DAO (Data Access Object) : public class BookDAO { private EntityManager em; private EntityTransaction tx; public BookDAO() { // Gets an entity manager and a transaction Page 2 - dernière modification par Pascal GRAFFION le 2011/06/28 16:13 GLG203 - TP13 EntityManagerFactory emf = Persistence.createEntityManagerFactory(”petstorePU”); em = emf.createEntityManager(); tx = em.getTransaction(); } public void persist(Book book) { tx.begin(); em.persist(book); // 1 tx.commit(); } Book findByISBN(String isbn) { String queryString = ”select b from Book b where b.isbn = :isbn”; Query query = em.createQuery( queryString ); // 2 query.setParameter( ”isbn”, isbn ); Book b = null; b = (Book)query.getSingleResult(); return b; } } L’entity manager peut notamment rendre persistant une entité par sa méthode persist() (1) ou permettre de retrouver une entité en base en créant une requête JPQL (2) Contexte de persistance L’entity manager utilise un contexte de persistance (petstorePU) qui le renseigne sur le type de la base de données et les paramètres de connexion à cette base de données. Ces informations sont décrites dans le fichier persistence.xml : <?xml version=”1.0” encoding=”UTF-8”?> <persistence xmlns=”http://java.sun.com/xml/ns/persistence” version=”1.0”> <persistence-unit name=”petstorePU” transaction-type=”RESOURCE_LOCAL”> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>domain.Book</class> <properties> <property name=”eclipselink.target-database” value=”MYSQL”/> <property name=”eclipselink.ddl-generation” value=”drop-and-create-tables”/> <property name=”eclipselink.logging.level” value=”INFO”/> <property name=”javax.persistence.jdbc.driver” value=”com.mysql.jdbc.Driver”/> <property name=”javax.persistence.jdbc.url” value=”jdbc:mysql://localhost:3306/petstorejpadb”/> <property name=”javax.persistence.jdbc.user” value=”root”/> <property name=”javax.persistence.jdbc.password” value=””/> </properties> </persistence-unit> </persistence> Exemple d’utilisation Le programme ci dessous crée une instance de Book, la rend persistente puis vérifie sa présence dans la base de données : public class Main { public static void main(String[] args) { // Creates an instance of book Book book = new Book(); String isbn = ”1-84023-742-2”; book.setTitle(”The Hitchhiker’s Guide to the Galaxy”); book.setPrice(12.5F); // Persists the book to the database BookDAO dao = new BookDAO(); dao.persist(book); // Retrieve one book from the database book = dao.findByISBN(isbn); System.out.println(”Book with isbn = “ + isbn); System.out.println(book); Page 3 - dernière modification par Pascal GRAFFION le 2011/06/28 16:13 GLG203 - TP13 Pour compiler ce programme utiliser la cible compile, pour l’exécuter utiliser la cible run. Ces cibles sont définies dans le fichier build.xml fourni; elles requièrent la présence des 2 fichiers jar javax.persistence-2.0.0.jar et eclipselink-2.0.0.jar. Noter que le fichier persistence.xml doit être trouvé lors de l’exécution; il doit être présent dans un répertoire META-INF trouvé dans le classpath; ceci est assuré par la cible prepare : <target name=”prepare” depends=”check”> <echo message=”Setup the Yaps environment”/> <mkdir dir=”${ classes.dir} ”/> <mkdir dir=”${ classes.dir} /META-INF”/> <copy file=”${ src.dir} /META-INF/persistence.xml” todir=”${ classes.dir} /META-INF”/> <mkdir dir=”${ build.dir} ”/> </target> Expression des besoins Analyse et conception Vue logique Nous allons conserver notre architecture en continuant à utiliser des DAOs. Ainsi seules les classes métiers et leurs DAOs vont être amenées à évoluer. Vue processus Vue implémentation Architecture Vue déploiement Identique au TP précédent. Implémentation Vous pouvez maintenant développer l’application à partir de la version précédente. Votre travail va consister essentiellement à réécrire les classes Category, Product et Item ainsi que leurs DAO associées. Recette utilisateur Téléchargez les classes de test représentant la recette utilisateur et exécutez la classe AllDomainTests. Page 4 - dernière modification par Pascal GRAFFION le 2011/06/28 16:13 GLG203 - TP13 Résumé Références Les cahiers du programmeurs : Java EE 5, 2nd Edition A Goncalves. Eyrolles. 2008. EntityManager Java EE5 javadoc http://download.oracle.com/javaee/5/api/index.html?javax/persistence/EntityManager.html Testing Java EE components : JPA 2.0 With EclipseLink http://www.antoniogoncalves.org/xwiki/bin/view/Article/TestingJPA JPA implementation patterns: Data Access Objects http://blog.xebia.com/2009/03/09/jpa-implementation-patterns-data-access-objects/ EclipseLink/Examples/JPA/JBoss Web Tutorial http://wiki.eclipse.org/EclipseLink/Examples/JPA/JBoss_Web_Tutorial#JNDI_JTA.2Fnon-JTA_Server_DataSourc e_Setup Page 5 - dernière modification par Pascal GRAFFION le 2011/06/28 16:13