presentation jpa
TRANSCRIPT
Java Persistence API JS Bournival
5 juin 2006
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 2
Agenda
Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 3
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
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 4
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 …
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 5
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.
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 6
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é.
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 7
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
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 8
Agenda
Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 9
PICSALARYID
EMP@Table(name="EMP")
Java Persistence API: Mappings de base
public class Employee {
private int id;
private String name;
private double salary;
private byte[] pic;
// getters & setters ... }
@Entity
@Id
@Column(name="EMP_NAME")
EMP_NAMENAME
@Lob
« BLOB »
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 10
Agenda
Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 11
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
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 12
@Table(name="EMP")
Relationship: Many to One
public class Employee {
private int id;
private Department d;
// getters & setters ... }
@Entity
@Id
public class Department {
private int id;
private String dname;
// getters & setters ... }
@Entity
@Id
@ManyToOne
FKPK
DEPT_IDID
EMP
PK
DNAMEID
DEPARTMENT
@JoinColumn(name="DEPT_ID")
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 13
@Table(name="EMP")
Relationship: One to Many
public class Employee {
private int id;
private Department d;
// getters & setters ... }
@Entity
@Id
public class Department {
private int id;
private String dname;
private Collection<Employee> emps;
// getters & setters ... }
@Entity
@Id
@ManyToOne
FKPK
DEPT_IDID
EMP
PK
DNAMEID
DEPARTMENT
@JoinColumn(name="DEPT_ID")
@OneToMany(mappedBy="d")
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 14
@Table(name="EMP")
Relationships: One to One
public class Employee {
private int id;
private ParkingSpace space;
// getters & setters ... }
@Entity
@Id
public class ParkingSpace {
private int id;
private int lot;
private String location;
private Employee emp;
// getters & setters ... }
@Entity
@Id
@OneToOne
FKPK
P_SPACEID
EMP
PK
LOCATIONLOTID
@JoinColumn(name="P_SPACE")
PARKINGSPACE
@OneToOne(mappedBy="space")
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 15
@Table(name="EMP")
Relationships: Many to Many
public class Employee {
private int id;
private Collection<Project> p;}
@Entity
@Id
public class Project {
private int id;
private String name;
private Collection<Employee> e;
// getters & setters ... }
@Entity
@Id
@ManyToMany
PK
SALARYNAMEID
EMP
PK
NAMEID
PROJECT
@ManyToMany(mappedBy="p")
PK,FK1
PROJ_IDEMP_ID
EMP_PROJ
PK,FK2
@JoinTable(name="EMP_PROJ",
joinColumns=
@JoinColumn(name="EMP_ID"),
inverseJoinColumns=
@JoinColumn(name="PROJ_ID"))
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 16
Agenda
Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 17
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)
-id-name-startDate
Employee
-vacation
NurunEmployee-dailyRate-term
ContractEmployee
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 18
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.
-id-name-startDate
Employee
-vacation
NurunEmployee-dailyRate-term
ContractEmployee
NAMESTART_DATEDAILY_RATETERMVACATION
IDPK
EMP
EMP_TYPE
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 19
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.
-id-name-startDate
Employee
-vacation
NurunEmployee-dailyRate-term
ContractEmployee
NAMESTART_DATEEMP_TYPE
IDPK
EMP
DAILY_RATETERM
IDPK,FK
ContractEmployee
VACATION
IDPK,FK
NurunEmployee
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 20
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.
-id-name-startDate
Employee
-vacation
NurunEmployee-dailyRate-term
ContractEmployee
NAME
S_DATE
DAILY_RATETERM
IDPK,FK
ContractEmployee
NAME
S_DATE
VACATION
IDPK,FK
NurunEmployee
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 21
Agenda
Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 22
Entity Manager: le cœur de la JPA
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.
É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!
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 23
Entity Manager: petit exemple
public class EmployeeServlet extends HttpServlet {
EntityManagerFactory emf;
public Employee find(int id) {
EntityManager em = emf.createEntityManager();
return em.find(Employee.class, id); }}
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 {
EntityManagerFactory emf;
public void createEmployee() {
EntityManager em = emf.createEntityManager();
Employee emp = new Employee();// apply setters// ...
em.persist(emp); }}
@PersistenceUnit(unitName="emp")
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 24
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
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 25
Agenda
Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 26
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.
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 27
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();…
}}
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 28
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();…
}}
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 29
Agenda
Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 30
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
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 31
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(); }}
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 32
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();
}}
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 33
Agenda
Présentation Les mappings de base Relations Héritage EntityManager Queries Transactions Demo Support et outils Références Questions
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 34
Petite demo sympathique
Amusons-nous tous ensemble avec: NetBeans 5.5 Glassfish (JEE 5.0) MySQL (5.0)
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 35
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.
Support de l’industrie
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 36
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 -> Hibernate EntityManager BEA Weblogic 9.2 -> SolarMetric Kodo (OpenJPA!) Sun GlassFish -> Oracle TopLink Essentials Oracle 10g AS -> Oracle TopLink Essentials IBM WS 7.0 (p-ê?) -> ???
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 37
Outils
Open source Eclipse 3.2.x w/ DALI NetBeans 5.5
Commerciaux Oracle Jdeveloper BEA Workshop Studio (Eclipse++) JBoss IDE (Eclipse++) gratuit
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 38
ReferencesWebJSR 220Projet DALIGlassfishHibernate EntityManagerSolarMetric KodoOracle ToplinkBEA dev2dev
BlogsMike KeithGavin KingThe Aquarium
BouquinPro EJB 3: Java Persistence API
http://www.jcp.org/en/jsr/detail?id=220http://www.eclipse.org/dali/https://glassfish.dev.java.net/http://hibernate.org/299.htmlhttp://solarmetric.com/Software/Kodo/kodoejb.phphttp://www.oracle.com/technology/products/ias/toplink/JPA/index.htmlhttp://dev2dev.bea.com/persistence/
http://www.jroller.com/page/mkeithhttp://blog.hibernate.org/http://blogs.sun.com/theaquarium
http://apress.com/book/bookDisplay.html?bID=10093
2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 39
Ext. 2112