39
Java Persistence API JS Bournival 5 juin 2006

Presentation JPA

Embed Size (px)

Citation preview

Page 1: Presentation JPA

Java Persistence API JS Bournival

5 juin 2006

Page 2: Presentation JPA

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

Page 3: Presentation JPA

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

Page 4: Presentation JPA

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 …

Page 5: Presentation JPA

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.

Page 6: Presentation JPA

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é.

Page 7: Presentation JPA

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

Page 8: Presentation JPA

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

Page 9: Presentation JPA

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 »

Page 10: Presentation JPA

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

Page 11: Presentation JPA

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

Page 12: Presentation JPA

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")

Page 13: Presentation JPA

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")

Page 14: Presentation JPA

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")

Page 15: Presentation JPA

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"))

Page 16: Presentation JPA

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

Page 17: Presentation JPA

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

Page 18: Presentation JPA

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

Page 19: Presentation JPA

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

Page 20: Presentation JPA

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

Page 21: Presentation JPA

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

Page 22: Presentation JPA

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!

Page 23: Presentation JPA

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")

Page 24: Presentation JPA

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

Page 25: Presentation JPA

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

Page 26: Presentation JPA

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.

Page 27: Presentation JPA

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();…

}}

Page 28: Presentation JPA

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();…

}}

Page 29: Presentation JPA

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

Page 30: Presentation JPA

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

Page 31: Presentation JPA

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(); }}

Page 32: Presentation JPA

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();

}}

Page 33: Presentation JPA

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

Page 34: Presentation JPA

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)

Page 35: Presentation JPA

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

Page 36: Presentation JPA

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-ê?) -> ???

Page 37: Presentation JPA

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

Page 38: Presentation JPA

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

Page 39: Presentation JPA

2006Communication interactive et nouvelles technologies / Interactive Communications through New Technologies Page 39

[email protected]

Ext. 2112