Java Persistence API (JPA)
1 Introduction
La technologie JPA (Java Persistence API 1) a pour objectif d’offrir un mod`ele d’ORM (Object Relational
Mapping) ind´ependant d’un produit particulier (comme Hibernate, TopLink, etc.). Cette technologie est bas´ee
sur
•un jeu d’interfaces et de classes permettant de s´eparer l’utilisateur d’un service de persistance (votre
application) et le fournisseur d’un service de persistance,
•un jeu d’annotations pour pr´eciser la mise en correspondance entre classes Java et tables relationnelles,
•un fournisseur de persistance (par exemple Hibernate),
•un fichier XML «persistence.xml »d´ecrivant les moyens de la persistance (fournisseur, datasource,
etc.)
Cette technologie est utilisable dans les applications Web (conteneur Web), ou dans les EJB (serveur d’appli-
cations) ou bien dans les applications standards (Java Standard Edition). C’est ce dernier cas que nous allons
´etudier.
Quelques liens :
La page JPA chez Sun
http://java.sun.com/javaee/technologies/persistence.jsp
Javadoc de l’API JPA 1.0 (JEE 5)
http://java.sun.com/javaee/5/docs/api/javax/persistence/package-summary.html
Javadoc de l’API JPA 2.0 (JEE 6)
http://java.sun.com/javaee/6/docs/api/javax/persistence/package-summary.html
Le tutorial JPA 1.0 (JEE 5)
http://java.sun.com/javaee/5/docs/tutorial/doc/bnbpy.html
Le tutorial JPA 2.0 (JEE 6)
http://java.sun.com/javaee/6/docs/tutorial/doc/bnbpy.html
La page de Wikipedia
http://en.wikipedia.org/wiki/Java Persistence API
De tr`es bons exemples
http://schuchert.wikispaces.com/EJB+3+and+Java+Persistence+API
http://www.java2s.com/Tutorial/Java/0355 JPA/Catalog0355 JPA.htm
Un petit manuel de r´ef´erence
http://jszyzx.scu.edu.cn/resin-doc/amber/index.xtp
Une documentation sur JPQL
http://download.oracle.com/docs/cd/E13189 01/kodo/docs40/full/html/ejb3 overview query.html
1. http://java.sun.com/javaee/technologies/persistence.jsp
1
2 Mise en place
2.1 Projet Eclipse
Pour la mise en pratique de JPA, nous allons utiliser le framework Hibernate 2qui va nous servir de fournisseur
de persistance. Plus pr´ecisement, suivez les ´etapes ci-dessous :
1. Cr´eez un projet Java (pas JPA) dans Eclipse et pr´eparez deux packages : monpkg.entities pour les
JavaBeans et monpkg.dao pour le service DAO.
2. Ajoutez Maven `a votre projet : S´electionnez votre projet /Bouton-droit /Configure /Convert to
Maven Project. Vous devez `a cette ´etape donner une num´ero de version `a votre projet. Laissez les valeurs
par d´efaut.
3. Cherchez sur MVNRepository 3le package Hibernate JPA Support et incluez dans le fichier pom.xml de
votre projet les d´ependances pour la version 5.
4. Faites de mˆeme pour le pilote JDBC MySql 4.
5. V´erifiez que la base de donn´ees est toujours op´erationnelle et que vous pouvez cr´eer des tables et ins´erer
des donn´ees. Profitez de cette ´etape pour pr´eparer une console dans laquelle vous pourrez utiliser le client
classique de votre base de donn´ees afin de suivre les modifications.
6. Cr´eez `a la racine des fichiers sources Java le fichier META-INF/persistence.xml avec le contenu ci-
dessous :
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="myBase" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- pour voir les requetes SQL -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<!-- parametres de connection JDBC -->
<property name="hibernate.connection.driver_class"
value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost/dbessai" />
<property name="hibernate.connection.username"
value="massat" />
<property name="hibernate.connection.password"
value="votre-mot-de-passe" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="hibernate.hbm2ddl.auto"
value="update" />
</properties>
</persistence-unit>
</persistence>
Pour s’adapter au SGBDR, Hibernate utilise une couche logicielle sp´ecifique `a chaque SGBDR. C’est le
2. http://www.hibernate.org/
3. http://mvnrepository.com
4. http://mvnrepository.com/open-source/mysql-drivers
2
dialect 5. Si vous n’utilisez pas MySQL, modifiez la propri´et´e dialect .
La propri´et´e hibernate.hbm2ddl.auto demande `a Hibernate de g´en´erer automatiquement les tables
n´ecessaires au bon fonctionnement de la couche JPA (`a noter que la valeur create-drop est aussi
int´eressante) 6.
2.2 Le service DAO
Nous commen¸cons par un service vide pour tester l’environnement.
package monpkg.dao;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Dao {
private EntityManagerFactory factory = null;
public void init() {
factory = Persistence.createEntityManagerFactory("myBase");
}
public void close() {
if (factory != null) {
factory.close();
}
}
}
Explications : Lors de l’initialisation, la classe Persistence 7est utilis´ee pour analyser les param`etres de
connection (fichier persistence.xml ) et trouver l’unit´e de persistance pass´ee en param`etre (myBase dans
cet exemple). A l’issue de cette ´etape nous r´ecup´erons une instance de l’interface EntityManagerFactory 8.
Cette usine, qui est g´en´eralement un singleton, nous permettra, dans un deuxi`eme temps, d’ouvrir des connections
vers la base de donn´ees.
2.3 Test du service DAO
Cr´eez une classe de test unitaire en vous basant sur Junit en version 4 :
5. http ://www.hibernate.org/hib docs/v3/reference/fr/html single/#configuration-optional-dialects
6. http ://www.hibernate.org/hib docs/v3/reference/fr/html single/#onfiguration-optional
7. http ://java.sun.com/javaee/6/docs/api/javax/persistence/Persistence.html
8. http ://java.sun.com/javaee/6/docs/api/javax/persistence/EntityManagerFactory.html
3
package monpkg.dao;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class TestDao {
static Dao dao;
@BeforeClass
public static void beforeAll() {
dao = new Dao();
dao.init();
}
@AfterClass
public static void afterAll() {
dao.close();
}
@Before
public void setUp() {
// pour plus tard
}
@After
public void tearDown() {
// pour plus tard
}
@Test
public void testVide() {
}
}
Explications : La classe Dao est instanci´ee une seule fois (annotation @BeforeClass ) car la cr´eation d’une
EntityManagerFactory 9est tr`es coˆuteuse. C’est typiquement une op´eration r´ealis´ee `a l’initialisation de l’ap-
plication.
V´erification : ex´ecutez ce test et v´erifiez son bon fonctionnement. Apr`es cette ´etape nous avons v´erifi´e les
param`etres et la connection avec le SGBDR.
3 Une premi`ere entit´e
Pour construire notre exemple, nous allons cr´eer une entit´e personne (classe Person ) :
9. http ://java.sun.com/javaee/6/docs/api/javax/persistence/EntityManagerFactory.html
4
3.1 Le javaBean Person
package monpkg.entities;
import java.io.Serializable;
import java.util.Date;
import java.util.Set;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PostUpdate;
import javax.persistence.PreUpdate;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.Version;
@Entity(name = "Person")
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id()
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Basic(optional = false)
@Column(name = "first_name", length = 200,
nullable = false, unique = true)
private String firstName;
@Basic()
@Temporal(TemporalType.DATE)
@Column(name = "birth_day")
private Date birthDay;
@Version()
private long version = 0;
@Transient
public static long updateCounter = 0;
public Person() {
super();
}
public Person(String firstName, Date birthDay) {
super();
this.firstName = firstName;
this.birthDay = birthDay;
}
@PreUpdate
public void beforeUpdate() {
System.err.println("PreUpdate of " + this);
}
@PostUpdate
public void afterUpdate() {
System.err.println("PostUpdate of " + this);
updateCounter++;
}
@Override
public String toString() {
return "Person(id=" + getId() + "," + firstName + "," + birthDay + ","
+ ",v" + getVersion() + ")";
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}
5
1 / 17 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!