Presentation JPA

14 032 vues

Publié le

Publié dans : Technologie

Presentation JPA

  1. 1. Java Persistence API JS Bournival 5 juin 2006
  2. 2. Agenda <ul><li>Présentation </li></ul><ul><li>Les mappings de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritage </li></ul><ul><li>EntityManager </li></ul><ul><li>Queries </li></ul><ul><li>Transactions </li></ul><ul><li>Demo </li></ul><ul><li>Support et outils </li></ul><ul><li>Références </li></ul><ul><li>Questions </li></ul>
  3. 3. Un peu d’histoire … <ul><li>Entity Beans EJB 1.0 -> 2.1 </li></ul><ul><li>Complexité </li></ul><ul><ul><li>La courbe d’apprentissage trop prononcée </li></ul></ul><ul><ul><li>Modèle de programmation non-intuitif </li></ul></ul><ul><li>Performance </li></ul><ul><ul><li>Le coût pour effectuer certaines requêtes était hors de proportions, le cycle de vie du container devenait un boulet </li></ul></ul>
  4. 4. Un peu d’histoire … <ul><li>Les équipes IT se sont de plus en plus tourné vers d’autres produits sur le marché: </li></ul><ul><li>Hibernate </li></ul><ul><ul><li>Le plus répandu dans la communauté présentement. Toutefois, la responsabilité de compatibilité avec différents serveurs d’application revient à la communauté. </li></ul></ul><ul><li>JDO </li></ul><ul><ul><li>Bien que JDO soit un standard, appuyé par la JSR 243 (JDO 2.0), cette technologie a reçu bien peu d’appui. </li></ul></ul><ul><li>Produits commerciaux (ex. TopLink) </li></ul><ul><ul><li>API propriétaires, onéreux, non-standard … </li></ul></ul>
  5. 5. Les besoins <ul><li>Clairement, 2 grands besoins se dégagèrent, répondant à l’industrie et aux développeurs: </li></ul><ul><li>Avoir une API simple d’utilisation , attrayante pour les développeurs, appliquant les techniques apprises des cadres d’applications de la communauté open source . </li></ul><ul><li>Avoir un standard respecté par les fournisseurs de serveurs d’applications. </li></ul>
  6. 6. EJB 3.0 vs. Java Persistence API <ul><li>Le standard tant souhaité, émerge avec la JSR 220, soit EJB 3.0. Cette spécification se divise en 2 parties: </li></ul><ul><ul><li>EJB 3.0, modèles de composants d’affaires (SLSB, SFSB, MDB) </li></ul></ul><ul><ul><li>JPA, Java Persistence API </li></ul></ul><ul><li>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é. </li></ul>
  7. 7. Java Persistence API: Quoi de neuf? <ul><li>On a littéralement évacué la complexité </li></ul><ul><li>Plus besoin de ces innombrables interfaces (Home, Remote, Local …) </li></ul><ul><li>On peut l’utiliser tant à l’extérieur, qu’à l’intérieur d’un container JEE </li></ul><ul><li>Chaque entité est maintenant un simple POJO * </li></ul><ul><li>Les mappings sont facilement mis en place, à l’aide d’annotations (Java SE 5.0) </li></ul>* 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. &quot;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.&quot; - Martin Fowler
  8. 8. Agenda <ul><li>Présentation </li></ul><ul><li>Les mappings de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritage </li></ul><ul><li>EntityManager </li></ul><ul><li>Queries </li></ul><ul><li>Transactions </li></ul><ul><li>Demo </li></ul><ul><li>Support et outils </li></ul><ul><li>Références </li></ul><ul><li>Questions </li></ul>
  9. 9. Java Persistence API: Mappings de base <ul><li>public class Employee { </li></ul><ul><li>private int id; </li></ul><ul><li>private String name; </li></ul><ul><li>private double salary; </li></ul><ul><li>private byte[] pic; </li></ul><ul><li>// getters & setters </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>@Table(name= &quot; EMP &quot; ) @Entity @Id @Column(name= &quot;EMP_NAME &quot; ) EMP_NAME NAME @Lob «  BLOB  » PIC SALARY ID EMP
  10. 10. Agenda <ul><li>Présentation </li></ul><ul><li>Les mappings de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritage </li></ul><ul><li>EntityManager </li></ul><ul><li>Queries </li></ul><ul><li>Transactions </li></ul><ul><li>Demo </li></ul><ul><li>Support et outils </li></ul><ul><li>Références </li></ul><ul><li>Questions </li></ul>
  11. 11. Relations <ul><li>4 types de relations à définir entre les entités de la JPA: </li></ul><ul><li>One to One </li></ul><ul><li>Many to One </li></ul><ul><li>One to Many </li></ul><ul><li>Many to Many </li></ul>
  12. 12. Relationship: Many to One <ul><li>public class Employee { </li></ul><ul><li>private int id; </li></ul><ul><li>private Department d; </li></ul><ul><li>// getters & setters </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>@Table(name= &quot; EMP &quot; ) @Entity @Id public class Department { private int id; private String dname; // getters & setters ... } @Entity @Id @ManyToOne FK PK DEPT_ID ID EMP PK DNAME ID DEPARTMENT @JoinColumn(name= &quot; DEPT_ID &quot; )
  13. 13. Relationship: One to Many <ul><li>public class Employee { </li></ul><ul><li>private int id; </li></ul><ul><li>private Department d; </li></ul><ul><li>// getters & setters </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>@Table(name= &quot; EMP &quot; ) @Entity @Id public class Department { private int id; private String dname; private Collection<Employee> emps; // getters & setters ... } @Entity @Id @ManyToOne FK PK DEPT_ID ID EMP PK DNAME ID DEPARTMENT @JoinColumn(name= &quot; DEPT_ID &quot; ) @OneToMany(mappedBy= &quot;d&quot;)
  14. 14. Relationships: One to One <ul><li>public class Employee { </li></ul><ul><li>private int id; </li></ul><ul><li>private ParkingSpace space; </li></ul><ul><li>// getters & setters </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>@Table(name= &quot; EMP &quot; ) @Entity @Id public class ParkingSpace { private int id; private int lot; private String location; private Employee emp; // getters & setters ... } @Entity @Id @OneToOne FK PK P_SPACE ID EMP PK LOCATION LOT ID @JoinColumn(name= &quot; P_SPACE &quot; ) PARKINGSPACE @OneToOne(mappedBy= &quot;space&quot; )
  15. 15. Relationships: Many to Many <ul><li>public class Employee { </li></ul><ul><li>private int id; </li></ul><ul><li>private Collection<Project> p ; </li></ul><ul><li>} </li></ul>@Table(name= &quot; EMP &quot; ) @Entity @Id public class Project { private int id; private String name; private Collection< Employee> e; // getters & setters ... } @Entity @Id @ManyToMany PK SALARY NAME ID EMP PK NAME ID PROJECT @ManyToMany(mappedBy= &quot;p&quot; ) PK,FK1 PROJ_ID EMP_ID EMP_PROJ PK,FK2 @JoinTable(name= &quot; EMP_PROJ &quot; , joinColumns= @JoinColumn(name= &quot; EMP_ID &quot; ), inverseJoinColumns= @JoinColumn(name= &quot; PROJ_ID &quot; ))
  16. 16. Agenda <ul><li>Présentation </li></ul><ul><li>Les mappings de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritage </li></ul><ul><li>EntityManager </li></ul><ul><li>Queries </li></ul><ul><li>Transactions </li></ul><ul><li>Demo </li></ul><ul><li>Support et outils </li></ul><ul><li>Références </li></ul><ul><li>Questions </li></ul>
  17. 17. Héritage <ul><li>L’héritage est supporté dans la JPA. Pour y arriver, 3 stratégie de mappings sont proposées: </li></ul><ul><ul><li>strategie 1 (single table + discriminator) </li></ul></ul><ul><ul><li>strategie 2 (joined tables) </li></ul></ul><ul><ul><li>strategie 3 (table per class) </li></ul></ul>
  18. 18. Héritage: single table <ul><li>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. </li></ul>EMP_TYPE NAME START_DATE DAILY_RATE TERM VACATION ID PK EMP
  19. 19. Héritage: joined table <ul><li>Cette stratégie imite la hiérachie de classes dans plusieurs table reliées. Ici aussi un discriminateur est nécessaire. </li></ul>NAME START_DATE EMP_TYPE ID PK EMP DAILY_RATE TERM ID PK,FK ContractEmployee VACATION ID PK,FK NurunEmployee
  20. 20. Héritage: table per concrete class <ul><li>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. </li></ul>NAME S_DATE DAILY_RATE TERM ID PK,FK ContractEmployee NAME S_DATE VACATION ID PK,FK NurunEmployee
  21. 21. Agenda <ul><li>Présentation </li></ul><ul><li>Les mappings de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritage </li></ul><ul><li>EntityManager </li></ul><ul><li>Queries </li></ul><ul><li>Transactions </li></ul><ul><li>Demo </li></ul><ul><li>Support et outils </li></ul><ul><li>Références </li></ul><ul><li>Questions </li></ul>
  22. 22. Entity Manager: le cœur de la JPA <ul><li>Les entités, une fois annotées, ne peuvent se persister de par elles-mê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. </li></ul><ul><li>Étape 1: mettre la main sur une instance EntityManager </li></ul><ul><li>Étape 2: persister nos POJO </li></ul><ul><li>Étape 3: … euh, il n’y a pas d’étape 3! </li></ul>
  23. 23. Entity Manager: petit exemple <ul><li>Regardons un petit exemple qui implique un EntityManager. Faisons-le à l’aide d’un Stateless Session Bean (EJB 3.0) tout simple. </li></ul>public class EmployeeServlet extends HttpServlet { EntityManagerFactory emf; public Employee find(int id) { EntityManager em = emf.createEntityManager(); return em.find(Employee.class, id); } } public class EmployeeServlet extends HttpServlet { EntityManagerFactory emf; public void createEmployee() { EntityManager em = emf.createEntityManager(); Employee emp = new Employee(); // apply setters // ... em.persist(emp); } } @PersistenceUnit(unitName= &quot; emp &quot; ) Dependency Injection!
  24. 24. EntityManager: déclarer le persistence unit <ul><li>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. </li></ul><?xml version=&quot;1.0&quot;?> <persistence> <persistence-unit name= &quot; emp &quot;> <jta-data-source>jdbc/EmployeeDS</jta-data-source> <!–- autres propriétés du persistence provider --> </persistence-unit> </persistence> persistence.xml
  25. 25. Agenda <ul><li>Présentation </li></ul><ul><li>Les mappings de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritage </li></ul><ul><li>EntityManager </li></ul><ul><li>Queries </li></ul><ul><li>Transactions </li></ul><ul><li>Demo </li></ul><ul><li>Support et outils </li></ul><ul><li>Références </li></ul><ul><li>Questions </li></ul>
  26. 26. Queries <ul><li>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. </li></ul>
  27. 27. Queries: NamedQueries <ul><li>On peut sauvegarder des gabarits de requête dans nos entités. C’est ce qu’on appelle une NamedQuery. Ceci permet : </li></ul><ul><li>La réutilisation de la requête </li></ul><ul><li>D’externaliser les requête du code. </li></ul>@Entity @NamedQuery(name= &quot; myQuery &quot; , query= &quot;Select o from MyPojo o&quot; ) public class MyPojo { … } public class MyService { public void myMethod () { … List results = em.createNamedQuery( &quot; myQuery &quot; ).getResultList(); … } }
  28. 28. Queries: NativeQueries <ul><li>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. </li></ul>public class MyService { public void myMethod () { … List results = em.createNativeQuery( “ SELECT * FROM MyPojo “, MyPojo.class ) .getResultList(); … } }
  29. 29. Agenda <ul><li>Présentation </li></ul><ul><li>Les mappings de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritage </li></ul><ul><li>EntityManager </li></ul><ul><li>Queries </li></ul><ul><li>Transactions </li></ul><ul><li>Demo </li></ul><ul><li>Support et outils </li></ul><ul><li>Références </li></ul><ul><li>Questions </li></ul>
  30. 30. Transactions <ul><li>2 façons de mettre en place les transactions: </li></ul><ul><li>JTA </li></ul><ul><ul><li>En utilisant la Java Transaction API, typiquement in-container </li></ul></ul><ul><li>Resource-local </li></ul><ul><ul><li>En utilisant le modèle de transaction du persistence manager </li></ul></ul>
  31. 31. Transactions: JTA <ul><li>Pour utiliser la JTA, il est requis de mettre la main sur la transaction en cours. </li></ul>public class MyServlet extends HttpServlet { … @Resource UserTransaction utx; public void doGet (…) { utx.begin() // persistence operations … utx.commit(); } }
  32. 32. Transactions: Resource-local <ul><li>Contrôllée manuellement. Tient compte uniquement de la transaction actuelle, indépendamment du serveur d’application. </li></ul><ul><li>public class MyServlet extends HttpServlet { </li></ul><ul><li>… </li></ul><ul><li>public void doGet (…) { </li></ul><ul><li>EntityManager em = emf.createEntityManager(); </li></ul><ul><ul><li>em.getTransaction().begin(); </li></ul></ul><ul><li>// persistence operations … </li></ul><ul><li>em.getTransaction().commit(); </li></ul><ul><li>em.close(); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  33. 33. Agenda <ul><li>Présentation </li></ul><ul><li>Les mappings de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritage </li></ul><ul><li>EntityManager </li></ul><ul><li>Queries </li></ul><ul><li>Transactions </li></ul><ul><li>Demo </li></ul><ul><li>Support et outils </li></ul><ul><li>Références </li></ul><ul><li>Questions </li></ul>
  34. 34. Petite demo sympathique <ul><li>Amusons-nous tous ensemble avec: </li></ul><ul><li>NetBeans 5.5 </li></ul><ul><li>Glassfish (JEE 5.0) </li></ul><ul><li>MySQL (5.0) </li></ul>
  35. 35. <ul><li>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. </li></ul>Support de l’industrie
  36. 36. Application server / persistence engine <ul><li>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: </li></ul><ul><li>JBoss AS -> Hibernate EntityManager </li></ul><ul><li>BEA Weblogic 9.2 -> SolarMetric Kodo (OpenJPA!) </li></ul><ul><li>Sun GlassFish -> Oracle TopLink Essentials </li></ul><ul><li>Oracle 10g AS -> Oracle TopLink Essentials </li></ul><ul><li>IBM WS 7.0 (p-ê?) -> ??? </li></ul>
  37. 37. Outils <ul><li>Open source </li></ul><ul><li>Eclipse 3.2.x w/ DALI </li></ul><ul><li>NetBeans 5.5 </li></ul><ul><li>Commerciaux </li></ul><ul><li>Oracle Jdeveloper </li></ul><ul><li>BEA Workshop Studio (Eclipse++) </li></ul><ul><li>JBoss IDE (Eclipse++) gratuit </li></ul>
  38. 38. References 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/ http://www.jroller.com/page/mkeith http://blog.hibernate.org/ http://blogs.sun.com/theaquarium http://apress.com/book/bookDisplay.html?bID=10093 <ul><li>Web </li></ul><ul><li>JSR 220 </li></ul><ul><li>Projet DALI </li></ul><ul><li>Glassfish </li></ul><ul><li>Hibernate EntityManager </li></ul><ul><li>SolarMetric Kodo </li></ul><ul><li>Oracle Toplink </li></ul><ul><li>BEA dev2dev </li></ul><ul><li>Blogs </li></ul><ul><li>Mike Keith </li></ul><ul><li>Gavin King </li></ul><ul><li>The Aquarium </li></ul><ul><li>Bouquin </li></ul><ul><li>Pro EJB 3: Java Persistence API </li></ul>
  39. 39. <ul><li>Questions? </li></ul><ul><li>[email_address] </li></ul><ul><li>Ext. 2112 </li></ul>

×