Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Presentation JPA

14,055 views

Published on

Published in: Technology

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>

×