Java Persistence API JS Bournival 5 juin 2006 Agenda Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 1 Un peu d’histoire … Entity Beans EJB 1.0 -> 2.1 Complexité La courbe d’apprentissage trop prononcée Modèle de programmation non-intuitif Performance Le coût pour effectuer certaines requêtes était hors de proportions, le cycle de vie du container devenait un boulet Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 2 Un peu d’histoire … Les équipes IT se sont de plus en plus tourné vers d’autres produits sur le marché: Hibernate Le plus répandu dans la communauté présentement. Toutefois, la responsabilité de compatibilité avec différents serveurs d’application revient à la communauté. JDO Bien que JDO soit un standard, appuyé par la JSR 243 (JDO 2.0), cette technologie a reçu bien peu d’appui. Produits commerciaux (ex. TopLink) API propriétaires, onéreux, non-standard … Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 3 Les besoins Clairement, 2 grands besoins se dégagèrent, répondant à l’industrie et aux développeurs: 1. Avoir une API simple d’utilisation, attrayante pour les développeurs, appliquant les techniques apprises des cadres d’applications de la communauté open source. 2. Avoir un standard respecté par les fournisseurs de serveurs d’applications. Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 4 EJB 3.0 vs. Java Persistence API Le standard tant souhaité, émerge avec la JSR 220, soit EJB 3.0. Cette spécification se divise en 2 parties: EJB 3.0, modèles de composants d’affaires (SLSB, SFSB, MDB) JPA, Java Persistence API Toutefois, cette spécification sera scindée en 2, de façon à faire évoluer la JPA, qui n’a plus rien à voir avec les EJB, seule de son côté. Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 5 Java Persistence API: Quoi de neuf? On a littéralement évacué la complexité Plus besoin de ces innombrables interfaces (Home, Remote, Local …) On peut l’utiliser tant à l’extérieur, qu’à l’intérieur d’un container JEE Chaque entité est maintenant un simple POJO * Les mappings sont facilement mis en place, à l’aide d’annotations (Java SE 5.0) * POJO – n.m. [pôdjô] POJO is an acronym for Plain Old Java Object, and is favoured by advocates of the idea that the simpler the design, the better. - Wikipedia. "We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it's caught on very nicely." - Martin Fowler Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 6 Agenda Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 7 Java Persistence API: Mappings de base EMP @Table(name="EMP") @Entity ID EMP_NAME NAME SALARY public class Employee { « BLOB » @Id private int id; @Column(name="EMP_NAME") private String name; private double salary; @Lob private byte[] pic; // getters & setters ... } Communication interactive et nouvelles technologies / Interactive Communications through New Technologies PIC 2006 Page 8 Agenda Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 9 Relations 4 types de relations à définir entre les entités de la JPA: One to One Many to One One to Many Many to Many Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 10 Relationship: Many to One @Entity @Table(name="EMP") @Entity public class Department { public class Employee { @Id private int id; @Id private int id; private String dname; // getters & setters ... @ManyToOne @JoinColumn(name="DEPT_ID") private Department d; } // getters & setters ... } DEPARTMENT EMP ID DEPT_ID ID PK FK PK Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 DNAME Page 11 Relationship: One to Many @Entity @Table(name="EMP") @Entity public class Department { public class Employee { @Id private int id; @Id private int id; private String dname; @ManyToOne @JoinColumn(name="DEPT_ID") @OneToMany(mappedBy="d") private Collection<Employee> emps; private Department d; // getters & setters ... // getters & setters ... } } DEPARTMENT EMP ID DEPT_ID ID PK FK PK Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 DNAME Page 12 Relationships: One to One @Entity @Table(name="EMP") @Entity public class ParkingSpace { public class Employee { @Id private int id; @Id private int id; private int lot; private String location; @OneToOne @JoinColumn(name="P_SPACE") private ParkingSpace space; @OneToOne(mappedBy="space") private Employee emp; // getters & setters ... // getters & setters ... } } PARKINGSPACE EMP ID P_SPACE ID PK FK PK Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 LOT LOCATION Page 13 Relationships: Many to Many @Entity @Table(name="EMP") @Entity public class Project { public class Employee { @Id private int id; @Id private int id; private String name; @ManyToMany(mappedBy="p") private Collection<Employee> e; @JoinTable(name="EMP_PROJ", joinColumns= // getters & setters ... @JoinColumn(name="EMP_ID"), inverseJoinColumns= } @ManyToMany @JoinColumn(name="PROJ_ID")) private Collection<Project> p; } EMP_PROJ EMP ID NAME SALARY PK Communication interactive et nouvelles technologies / Interactive Communications through New Technologies PROJECT EMP_ID PROJ_ID ID PK,FK1 PK,FK2 PK 2006 Page 14 NAME Agenda Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 15 Héritage L’héritage est supporté dans la JPA. Pour y arriver, 3 stratégie de mappings sont proposées: strategie 1 (single table + discriminator) strategie 2 (joined tables) strategie 3 (table per class) Employee -id -name -startDate ContractEmployee -dailyRate -term Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 NurunEmployee -vacation Page 16 Héritage: single table Cette stratégie applatit la hiérachie de classes dans une seule table contenant tous les attributs de la hiérarchie. Les spécialisations sont différiencées par un discriminateur. Employee -id -name -startDate EMP PK ID NAME START_DATE DAILY_RATE TERM VACATION EMP_TYPE Communication interactive et nouvelles technologies / Interactive Communications through New Technologies ContractEmployee -dailyRate -term 2006 NurunEmployee -vacation Page 17 Héritage: joined table Cette stratégie imite la hiérachie de classes dans plusieurs table reliées. Ici aussi un discriminateur est nécessaire. ContractEmployee PK,FK Employee -id -name -startDate ID DAILY_RATE TERM EMP PK ID NAME START_DATE EMP_TYPE NurunEmployee PK,FK ID VACATION ContractEmployee -dailyRate -term Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 NurunEmployee -vacation Page 18 Héritage: table per concrete class Ici, tous les attributs d’une classe + ses attributs hérités, sont mis ensemble dans une seule table. Une par classe feuille (concrete class). Les superclasses ne sont pas représentées dans cette stratégie. Employee -id -name -startDate ContractEmployee PK,FK ID NAME S_DATE DAILY_RATE TERM NurunEmployee PK,FK ID NAME S_DATE VACATION ContractEmployee -dailyRate -term Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 NurunEmployee -vacation Page 19 Agenda Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 20 Entity Manager: le cœur de la JPA Les entités, une fois annotées, ne peuvent se persister de par ellesmêmes. Elles ont besoins d’un engin, qui lui, performera les opérations sur la base de données, en concordance avec les mappings définis dans les annotations. Étape 1: mettre la main sur une instance EntityManager Étape 2: persister nos POJO Étape 3: … euh, il n’y a pas d’étape 3! Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 21 Entity Manager: petit exemple Regardons un petit exemple qui implique un EntityManager. Faisons-le à l’aide d’un Stateless Session Bean (EJB 3.0) tout simple. public class EmployeeServlet extends HttpServlet { @PersistenceUnit(unitName="emp") EntityManagerFactory emf; public Employee void createEmployee() find(int id) { EntityManager EntityManager emem = = emf.createEntityManager(); emf.createEntityManager(); } } return Employee em.find(Employee.class, emp = new Employee(); id); // apply setters // ... em.persist(emp); } } Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 22 EntityManager: déclarer le persistence unit Le fichier persistence.xml, est l’endroit où l’on déclare notre persistence unit. C’est aussi là où l’on configure notre persistence manager. <?xml version="1.0"?> <persistence> <persistence-unit name="emp"> <jta-data-source>jdbc/EmployeeDS</jta-data-source> <!–- autres propriétés du persistence provider --> </persistence-unit> </persistence> persistence.xml Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 23 Agenda Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 24 Queries La JPA introduit le JPA-QL, qui est, tout comme le EJBQL ou encore le HQL, un langage de requête du modèle objet, basé sur SQL. Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 25 Queries: NamedQueries On peut sauvegarder des gabarits de requête dans nos entités. C’est ce qu’on appelle une NamedQuery. Ceci permet : La réutilisation de la requête D’externaliser les requête du code. @Entity @NamedQuery(name="myQuery", query="Select o from MyPojo o") public class MyPojo { … } public class MyService { public void myMethod() { … List results = em.createNamedQuery("myQuery").getResultList(); … } } Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 26 Queries: NativeQueries Une façon de faire des requête en SQL natif. Sert principalement à avoir plus de contrôle sur les requêtes à la base de donnée. public class MyService { public void myMethod() { … List results = em.createNativeQuery(“SELECT * FROM MyPojo“, MyPojo.class) .getResultList(); … } } Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 27 Agenda Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 28 Transactions 2 façons de mettre en place les transactions: JTA En utilisant la Java Transaction API, typiquement in-container Resource-local En utilisant le modèle de transaction du persistence manager Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 29 Transactions: JTA Pour utiliser la JTA, il est requis de mettre la main sur la transaction en cours. public class MyServlet extends HttpServlet { … @Resource UserTransaction utx; public void doGet(…) { utx.begin() // persistence operations … utx.commit(); } } Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 30 Transactions: Resource-local Contrôllée manuellement. Tient compte uniquement de la transaction actuelle, indépendamment du serveur d’application. public class MyServlet extends HttpServlet { … public void doGet(…) { EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); // persistence operations … em.getTransaction().commit(); em.close(); } } Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 31 Agenda Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 32 Petite demo sympathique Amusons-nous tous ensemble avec: NetBeans 5.5 Glassfish (JEE 5.0) MySQL (5.0) Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 33 Support de l’industrie La JPA a fait concensus à JavaOne2006, tous les grands acteurs y trouvent leur compte, et jusqu’à preuve du contraire, vont supporter et endosser cette technologie. Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 34 Application server / persistence engine Les serveurs d’application ont tous placé leurs pions en vue de l’avènement de la JPA. Chacun a intégré un persistence manager de leur choix: JBoss AS BEA Weblogic 9.2 Sun GlassFish Oracle 10g AS IBM WS 7.0 (p-ê?) -> Hibernate EntityManager -> SolarMetric Kodo (OpenJPA!) -> Oracle TopLink Essentials -> Oracle TopLink Essentials -> ??? Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 35 Outils Open source Eclipse 3.2.x w/ DALI NetBeans 5.5 Commerciaux Oracle Jdeveloper BEA Workshop Studio (Eclipse++) JBoss IDE (Eclipse++) gratuit Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 36 References Web JSR 220 Projet DALI Glassfish Hibernate EntityManager SolarMetric Kodo Oracle Toplink BEA dev2dev http://www.jcp.org/en/jsr/detail?id=220 http://www.eclipse.org/dali/ https://glassfish.dev.java.net/ http://hibernate.org/299.html http://solarmetric.com/Software/Kodo/kodoejb.php http://www.oracle.com/technology/products/ias/toplink/JPA/index.html http://dev2dev.bea.com/persistence/ Blogs Mike Keith Gavin King The Aquarium http://www.jroller.com/page/mkeith http://blog.hibernate.org/ http://blogs.sun.com/theaquarium Bouquin Pro EJB 3: Java Persistence API http://apress.com/book/bookDisplay.html?bID=10093 Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 37 Questions? [email protected] Ext. 2112 Communication interactive et nouvelles technologies / Interactive Communications through New Technologies 2006 Page 38