Java Persistence API  JS Bournival 5 juin 2006
Agenda <ul><li>Présentation </li></ul><ul><li>Les  mappings  de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritag...
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’app...
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>...
Les besoins <ul><li>Clairement, 2 grands besoins se dégagèrent, répondant à l’industrie et aux développeurs: </li></ul><ul...
EJB 3.0 vs. Java Persistence API <ul><li>Le standard tant souhaité, émerge avec la JSR 220, soit EJB 3.0.  Cette spécifica...
Java Persistence API:  Quoi de neuf? <ul><li>On a littéralement évacué la complexité </li></ul><ul><li>Plus besoin de ces ...
Agenda <ul><li>Présentation </li></ul><ul><li>Les  mappings  de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritag...
Java Persistence API:  Mappings  de base <ul><li>public  class  Employee  { </li></ul><ul><li>private  int  id; </li></ul>...
Agenda <ul><li>Présentation </li></ul><ul><li>Les  mappings  de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritag...
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><...
Relationship:  Many to One <ul><li>public  class  Employee  { </li></ul><ul><li>private  int  id; </li></ul><ul><li>privat...
Relationship:  One to Many <ul><li>public  class  Employee  { </li></ul><ul><li>private  int  id; </li></ul><ul><li>privat...
Relationships:  One to One <ul><li>public  class  Employee  { </li></ul><ul><li>private  int  id; </li></ul><ul><li>privat...
Relationships:  Many to Many <ul><li>public  class  Employee  { </li></ul><ul><li>private  int  id; </li></ul><ul><li>priv...
Agenda <ul><li>Présentation </li></ul><ul><li>Les  mappings  de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritag...
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><...
Héritage: single table <ul><li>Cette stratégie applatit la hiérachie de classes dans une seule table contenant tous les at...
Héritage: joined table <ul><li>Cette stratégie imite la hiérachie de classes dans plusieurs table reliées.  Ici aussi un d...
Héritage: table per concrete class <ul><li>Ici, tous les attributs d’une classe + ses attributs hérités, sont mis ensemble...
Agenda <ul><li>Présentation </li></ul><ul><li>Les  mappings  de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritag...
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.  Ell...
Entity Manager: petit exemple <ul><li>Regardons un petit exemple qui implique un EntityManager.  Faisons-le à l’aide d’un ...
EntityManager:  déclarer le  persistence unit <ul><li>Le fichier persistence.xml, est l’endroit où l’on déclare notre pers...
Agenda <ul><li>Présentation </li></ul><ul><li>Les  mappings  de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritag...
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...
Queries: NamedQueries <ul><li>On peut sauvegarder des gabarits de requête dans nos entités.  C’est ce qu’on appelle une  N...
Queries: NativeQueries <ul><li>Une façon de faire des requête en SQL natif.  Sert principalement à avoir plus de contrôle ...
Agenda <ul><li>Présentation </li></ul><ul><li>Les  mappings  de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritag...
Transactions <ul><li>2 façons de mettre en place les transactions: </li></ul><ul><li>JTA </li></ul><ul><ul><li>En utilisan...
Transactions: JTA <ul><li>Pour utiliser la JTA, il est requis de mettre la main sur la transaction en cours.  </li></ul>pu...
Transactions:  Resource-local <ul><li>Contrôllée manuellement.  Tient compte uniquement de la transaction actuelle, indépe...
Agenda <ul><li>Présentation </li></ul><ul><li>Les  mappings  de base </li></ul><ul><li>Relations </li></ul><ul><li>Héritag...
Petite demo sympathique <ul><li>Amusons-nous tous ensemble avec: </li></ul><ul><li>NetBeans 5.5 </li></ul><ul><li>Glassfis...
<ul><li>La JPA a fait concensus à JavaOne2006, tous les grands acteurs y trouvent leur compte, et jusqu’à preuve du contra...
Application server / persistence engine <ul><li>Les serveurs d’application ont tous placé leurs pions en vue de l’avènemen...
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>Commer...
References http://www.jcp.org/en/jsr/detail?id=220 http://www.eclipse.org/dali/ https://glassfish.dev.java.net/ http://hib...
<ul><li>Questions? </li></ul><ul><li>[email_address] </li></ul><ul><li>Ext. 2112 </li></ul>
Prochain SlideShare
Chargement dans…5
×

Presentation JPA

13 887 vues

Publié le

Publié dans : Technologie
1 commentaire
3 j’aime
Statistiques
Remarques
Aucun téléchargement
Vues
Nombre de vues
13 887
Sur SlideShare
0
Issues des intégrations
0
Intégrations
104
Actions
Partages
0
Téléchargements
793
Commentaires
1
J’aime
3
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • 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>

    ×