Table des matières

D21 - TP2 - JPA Java Persistence API

Pour une introduction à JPA lire ce document et ce document

Maven et JPA

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>

persistence.xml

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éation et manipulation simple d'une entité

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

Compléter l'application

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.

DAO Generique

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 finir

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