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 peciser 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 pecisement, suivez les ´etapes ci-dessous :
1. Cr´eez un projet Java (pas JPA) dans Eclipse et peparez deux packages : monpkg.entities pour les
JavaBeans et monpkg.dao pour le service DAO.
2. Ajoutez Maven `a votre projet : 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.
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 linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !