D21 - TP2 - JPA Java Persistence API

Pour une introduction à JPA lire ce document et ce document

  • Créer un projet maven à partir de l’archetype quickstart
    mvn archetype:generate
  • Modifier le pom.xml pour ajouter les dépendances vers la base de données et l’implantation de JPA. Par exemple pour postgresql et eclipselink :
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>fr.univ_tln.bruno.test</groupId>
    <artifactId>jpa</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
 
    <name>jpa</name>
    <url>http://maven.apache.org</url>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
 
    <dependencies>
 
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.7.7</version>
        </dependency>
 
       <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.5</version>
       </dependency>
 
        <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
           <scope>test</scope>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <!-- Compilateur Java -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
 
       </plugins>
    </build>
 
</project>
  • Définir le ou les supports de persistance du projet en créant un fichier src/main/resources/META-INF/persistence.xml. L’exemple suivant configure une unité de persistance appelée testpostgresqllocal. Il faut au minimum adapter la configuration de jdbc (url, user et password).
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
 
    <persistence-unit name="testpostgresqllocal" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>        
        <properties>
            <!-- Les paramètres de connexions -->
            <property name="javax.persistence.target-database" value="PostgreSQL"/>
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>
            <property name="javax.persistence.jdbc.user" value="test"/>
            <property name="javax.persistence.jdbc.password" value="test"/>
 
            <!-- Les options de générations des tables -->
           <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
           <property name="javax.persistence.schema-generation.scripts.action" value="drop-and-create"/>
           <property name="javax.persistence.schema-generation.scripts.create-target" value="sampleCreate.ddl"/>
           <property name="javax.persistence.schema-generation.scripts.drop-target" value="sampleDrop.ddl"/>
 
           <property name="javax.persistence.sql-load-script-source" value="insert.sql"/>
 
        </properties>
    </persistence-unit>
</persistence>

Créer une entité Personne possédant un entier comme identifiant, un nom, un prénom et un âge.

Ajouter la définition de l’entité dans le persistence.xml (<class>fr.univ_tln.bruno.test.jpa.Personne</class> dans persistence-unit).

Créer une classe exécutable Test1 qui :

  1. crée un entityManager
  2. instancie des Personnes et les rend persistantes.
 EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("testpostgresqllocal");
        EntityManager em = emf.createEntityManager();
 
        Personne p1 = new Personne("Pierre","Durand");
 
        EntityTransaction transac = em.getTransaction();
 
        transac.begin();
        em.persist(p1);
        transac.commit()

Créer une classe Test2 qui :

  1. crée un entityManager
  2. restaure les personnes précédentes en utilisant leur identifiant et les affiche
  3. les modifie en augmentant leur poids de 1 et les met à jour dans la base (cf. les méthodes en EntityManager).
Personne personne = em.find(Personne.class, 1);

Définir qu’une personne ne possède qu’un seul chien, chaque chien n’ayant qu’un seul propriétaire. Une personne est maintenant définie par son couple (nom,prénom) supposé unique dans l’application.

Définir un chenil qui peut contenir plusieurs chiens.

Définir une pathologie (elle a un nom et et une description), un chien peut en avoir plusieurs.

Mettre en place, les cascades pour que la suppression d’un Chien supprime ses pathologies mais pas son maître.

En vous inspirant de http://www.adam-bien.com/roller/abien/entry/generic_crud_service_aka_dao mettez en place une DAO générique qui propose les opérations CRUD et l’appel de requêtes nommées.

Pour écrire des requêtes dans un langage de haut niveau et utiliser un cache lisez les chapitres 42,43,44 et 46 de la partie concernant la persistance du tutoriel de JavaEE https://javaee.github.io/tutorial/partpersist.html#BNBPY

—- dataentry page —- type : TP enseignement_tags : D21 technologie_tags : JPA, Stream, Lambda, Java theme_tags : POO, Persistance, CRUD, DAO