SPRING DATA JPA – PREMIÈRE ENTITÉ

Programming, Math, etc. · course

SPRING DATA JPA – PREMIÈRE ENTITÉ

UP ASI

Bureau E204

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

1

Plan du Cours

– Persistance

– JDBC

– ORM

– JPA

– Hibernate

– Spring Data

– Spring Data JPA

– Entité

– Annotations

– Configuration d’une DataSource avec Spring Boot

– TP Spring Boot + Spring Data JPA : 1ère Entité

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

2

PERSISTANCE

• Le Modèle Relationnel : les systèmes de gestion de bases de

données relationnels (SGBDR) sont devenus un pilier

incontournable dans le développement d’applications.

• Le modèle Object : se base sur la programmation orientée

objet. Celle-ci permet aux applications d’atteindre un excellent

niveau de qualité et de flexibilité.

• Comment stocker les objets modélisés de la mémoire vers les

SGBDR ?

• On parle ainsi de persistance d’objets métiers.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

3

PERSISTANCE

• Pour persister les données :

– Développer manuellement le code de projection des objets sur le

support relationnel (Utilisation de JDBC natif).

Ou :

– Utiliser un Framework de projection objet-relationnel : EclipseLink,

Hibernate , Spring Data JPA … Ces Frameworks implémentent la

spécification JavaEE JPA.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

4

JDBC

• JDBC (Java DataBase Connectivity) est une interface de

programmation créée par Sun Microsystems (racheté par

Oracle Corporation).

• C’est une API (Application Programming Interface) pour les

programmes utilisant la plateforme Java.

• Elle permet aux applications Java d'accéder à des bases de

données, en utilisant des pilotes JDBC (Drivers).

• Des pilotes JDBC sont disponibles pour tous les systèmes connus

de bases de données relationnelles.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

5

JDBC

• L’utilisation de l’API JDBC était une solution pour les

développeurs java pour manipuler les données dans une base

de donnée SQL (CRUD).

Inconvénients :

– Pas de séparation entre le code technique et le code métier.

– utilisation du langage SQL rend la couche d’accès aux données

difficilement maintenable.

• Exemple :

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

6

JDBC

public void addClient(Client client) {

Connection conn = null; PreparedStatement preparedStmt = null;

try {

conn = DriverManager.getConnection(DB_URL,USER,PASSWORD);

String insertSQL = "INSERT INTO CLIENT (idClient, nom, prenom, email, password,

dateNaissance,profession,categorieClient) VALUES (?, ?, ?, ?, ?, ?, ?,?)";

preparedStmt = conn.prepareStatement(insertSQL);

preparedStmt.setInt(1, client.getIdClient());

preparedStmt.setString(2, client.getNom());

preparedStmt.setString(3, client.getPrenom()); preparedStmt.setString(4,

client.getEmail()); preparedStmt.setString(5, client.getPassword());

preparedStmt.setString(6, client.getDateNaissance()); preparedStmt.setString(7,

client.getProfession(); preparedStmt.setString(8, client,getCategorieClient());

preparedStmt.execute();

}

Publicité

catch (SQLException e) { e.printStackTrace(); }

finally { try { preparedStmt.close(); } catch (SQLException e) { e.printStackTrace(); }

}

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

7

ORM

• Pour éviter les inconvénients liés à l’utilisation de l’API JDBC

nativement, le concept d’ORM a vu le jour.

• Le Mapping Objet → Relationnel (ORM) est une technique de

programmation, qui permet d’associer une ou plusieurs classes

avec une table, et chaque attribut de la classe avec un champ

de la table.

• Elle vise à réduire la quantité de code produit par l’API JDBC (les

opérations sont les mêmes : Connexion + CRUD + Déconnexion).

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

8

ORM - JDBC

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

9

ORM - JDBC

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere

Entité

10

JPA

• Pour normaliser le fonctionnement des ORM, JPA a été mis en

place.

• La Java Persistance API (abrégée en JPA), est une interface de

programmation Java permettant de normaliser l’utilisation et la

communication avec la couche de données, d’une application

Java.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

11

JPA

l'utilisation de JPA nécessite un fournisseur de persistance (ORM)

qui implémente les spécifications JPA (Hibernate, Toplink, ...)

• Dans ce cours nous allons utiliser Spring Data JPA qui se base sur

Hibernate comme implémentation de la spécification JPA.

• JPA est une spécification (normalisation et standardisation de la

communication avec la DB).

• Hibernate est un produit (Implémentation de cette

spécification).

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

12

HIBERNATE

• Hibernate est un Framework open source gérant la persistance

des objets en base de données relationnelle.

Il gère le Mapping entre les objets de l’application et la base de

données.

• C’est un projet maintenu par l’entreprise JBoss, appartenant à

RedHat.

• L’utilisation de JPA / HIBERNATE nous permet de gagner du

temps en développement :

– Génération automatique du code SQL (CRUD).

– Génération automatique des tables à partir des entités Java.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

13

SPRING DATA

• C’est un module Spring (Pivotal) qui a pour but de :

– Faciliter l’écriture des couches d’accès aux données.

– Offrir une abstraction commune pour l’accès aux données quelle que soit la

source de données (SQL ou NoSQL).

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

14

SPRING DATA JPA

• Spring Data JPA est un sous projet du projet Spring Data.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

15

SÉRIALISATION / DÉSÉRIALISATION

• La sérialisation est le processus de conversion d'un objet en un

flux d'octets pour stocker l'objet ou le transmettre à la mémoire,

à une base de données, ou dans un fichier.

• Son principal objectif est d'enregistrer l'état d'un objet afin de

pouvoir le recréer si nécessaire, par mécanisme de

désérialisation.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

16

ENTITÉ JPA

• Une entité est une classe dont les instances peuvent être persistantes.

• Elle est déclarée avec l'annotation @Entity.

Publicité

• Elle possède au moins une propriété déclarée comme identité de

l’entité avec l'annotation @Id.

• Elle implémente l’interface java.io.Serializable.

• Utilisation d'annotations

– Sur la classe : correspondance avec la table associée.

– Sur les attributs ou sur les propriétés : correspondance avec les colonnes

de la table.

• La classe est un JavaBean (attributs, accesseurs, mutateurs)

• Exemple :

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

17

ENTITE JPA

package tn.esprit.entity;

import javax.persistence.Column; import javax.persistence.Entity;

import javax.persistence.GeneratedValue; import javax.persistence.Id;

import javax.persistence.Table;

………

@Entity

@Table( name = "Client")

public class Client implements Serializable {

@Id

@GeneratedValue (strategy = GenerationType.IDENTITY)

@Column(name="idClient")

private Long idClient; // Clé primaire

private String nom;

private String prenom;

private String email;

private String password;

@Temporal(TemporalType.DATE)

private Date dateNaissance;

@Enumerated(EnumType.STRING)

private Profession profession;

@Enumerated(EnumType.STRING)

private CategorieClient categorieClient;

// Constructeur et accesseurs (getters) et mutateurs (setters)

}

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

18

ANNOTATIONS

• @Entity : Obligatoire, sur la classe.

• Une entité, déclarée par l’annotation @Entity définit une classe Java comme

étant persistante et donc associée à une table dans la base de données.

• Par défaut, une entité est associée à la table portant le même nom que la

classe. Il est possible d’indiquer le nom de la table par une annotation

@Table.

• @Table (name="nomTable") : Facultatif, sur la classe. Cette annotation

permet de mapper les objets de la classe avec la table dont le nom est

redéfini. Si omis, la table prend le nom de la classe.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

19

ANNOTATIONS

• @Id : La déclaration d'une clé primaire est obligatoire. Sur un attribut

ou sur le getter

• @GeneratedValue : Facultatif, sur l'attribut ou sur le getter annoté

avec @Id. Définit la manière dont la base gère la génération de la clé

primaire. L’attribut "strategy" obligatoire pouvant avoir comme valeur :

AUTO / IDENTITY / SEQUENCE / TABLE :

@Id

@GeneratedValue (strategy = GenerationType.IDENTITY)

@Column(name="idClient")

private int idClient; // Clé primaire

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

20

ANNOTATIONS

– Strategy = GenerationType.AUTO : la génération de la clé primaire est garantie par le

fournisseur de persistance (hibernate), une séquence unique de clé primaire pour tout

le schéma de base de données défini dans une table hibernate_sequence.

– Strategy = GenerationType.TABLE : la génération des clés primaires est garantie par le

fournisseur de persistance (hibernate), une séquence de clés primaires par table définie

dans une table hibernate_sequences, cette table contient deux colonnes : une pour le

nom de la séquence et l’autre pour la prochaine valeur.

– Strategy = GenerationType.IDENTITY. Hibernate s'appuie alors sur le mécanisme propre

au SGBD pour la production de l'identifiant.

Dans le cas de MySQL, c'est l'option AUTO-INCREMENT, dans le cas de Postgres ou

Oracle, c’est une séquence. On recommande l’IDENTITY.

– Strategy = GenerationType.SEQUENCE = GenerationType.AUTO, mais c’est nous qui

définissions les détails de la séquence.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

21

Exercice

1-

Publicité

@Id

@GeneratedValue (strategy = GenerationType.IDENTITY)

@Column(name="idClient")

private Long idClient; // Clé primaire

@Id

@Column(name="idClient")

private Long idClient; // Clé primaire

• Comment le champ idClient de la table Client sera alimenté dans chacun des

deux cas?

2- Exécuter la requête SQL : show table status;

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

22

ANNOTATIONS

• @Column est une annotation utile pour indiquer le nom de la colonne

dans la table, quand cette dernière est différente du nom de la

propriété en java. Les principaux attributs pour @Column.

– name indique le nom de la colonne dans la table;

– length indique la taille maximale de la valeur de la propriété;

– nullable (avec les valeurs false ou true) indique si la colonne

accepte ou non des valeurs à NULL;

– unique indique que la valeur de la colonne est unique.

• @Transient

– Facultatif, sur un attribut

– Indique que l'attribut ne sera pas mappé (et donc non persisté)

dans la table

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

23

ANNOTATIONS

• @Temporal : gère l’attribut en tant que date.

• Pour déclarer une date :

// TIME : 30-09-19 10:50:56.780000000 AM

// DATE : 30-09-19

// TIMESTAMP : 1569840656 (nbre de secondes entre 01/01/1970 et la date voulue)

@Temporal (TemporalType.DATE)

private Date dateDebut;

• Pour insérer une date :

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

Date dateDebut = dateFormat.parse("30/09/2019");

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

24

ANNOTATIONS

• @Enumerated :

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

25

Héritage

• Pour représenter un modèle hiérarchique dans un modèle relationnel, JPA

propose alors trois stratégies possibles :

• 1. Une seule table unique pour l'ensemble de la hiérarchie des classes.

L'ensemble des attributs de toute la hiérarchie des entités est mis à plat et

regroupé dans une seule table (il s'agit d'ailleurs de la stratégie par défaut).

• 2. Une table pour chaque classe concrète. Chaque entité concrète de la

hiérarchie est associée à une table.

• 3. Jointure entre sous-classes. Dans cette approche, chaque entité de la

hiérarchie, concrète ou abstraite, est associée à sa propre table. Ainsi, nous

obtenons dans ce cas là une séparation des attributs spécifiques de la classe

fille par rapport à ceux de la classe parente. Il existe alors, une table pour

chaque classe fille, plus une table pour la classe parente. Une jonction est

alors nécessaire pour instancier la classe fille.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

26

TP – Spring Data JPA – 1ère Entité

• Nous allons dans ce TP manipuler des données en base de

données en utilisant Spring Data JPA.

• Pour faciliter l’implémentation de ce TP, nous allons utiliser

également Spring Boot.

• Les étapes seront décrites dans les slides suivants :

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

27

TP – Spring Data JPA – 1ère Entité

• Nouveau Projet : Spring Starter Project

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

28

TP – Spring Data JPA – 1ère Entité

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

29

TP – Spring Data JPA – 1ère Entité

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

30

TP – Spring Data JPA – 1ère Entité

Faites un maven build …

clean install

Publicité

skip test

supprime la mention

« pom.xml » dans le profiles

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

31

TP – Spring Data JPA – 1ère Entité

• Pour pouvoir se connecter à votre base de données, quel fichier faut-

il mettre à jour?

(Regarder l’arborescence du projet créé).

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

32

TP – Spring Data JPA – 1ère Entité

• Dans ce fichier de properties ajouter les lignes suivantes :

DATABASE ###

#spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/springDB?useUnicode=true&use

JDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

spring.datasource.username=root

spring.datasource.password=

JPA / HIBERNATE ###

spring.jpa.show-sql=true

spring.jpa.hibernate.ddl-auto=update

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

NB : Créer manuellement dans MySQL la base de donnée springDB ( phpMyAdmin => Nouvelle base de

données.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

33

TP – Spring Data JPA – 1ère Entité

• Créer les package tn.esprit.spring.entity

• Créer l’entité JPA Produit, avec les attributs suivants :

– idProduit (Long, clé primaire, auto-increment)

– code(String)

– libelle (String)

– prixUnitaire(float)

• Créer l’entité JPA DetailProduit, avec les attributs suivants :

– idDetailProduit (Long, clé primaire, auto-increment)

– dateCreation(Date)

– dateDerniereModification (String)

– categorieProduit(Enumeration CategorieProduit)

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

34

Erreur (si ancien MySQL)

• Vérifier que la table a ben été créée dan a base de données :

• Si Erreur lors de l’exécution :

java.sql.SQLException: The server time zone value 'Paris, Madrid' is

unrecognized or represents more than one time zone. You must

configure either the server or JDBC driver (via the serverTimezone

configuration property) to use a more specifc time zone value if you

want to utilize time zone support.

• Solution : dans application.properties :

spring.datasource.url=jdbc:mysql://localhost:3306/springDB?us

eUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDat

etimeCode=false&serverTimezone=UTC

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

35

Exercice

Tp gestion Magasin/Stock

Partie 1 Spring Data JPA – Première entité

Créer les entités se trouvant dans le diagramme des classes (sans les

associations) et vérifier qu’ils ont été ajoutés avec succès dans la base

de données.

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

36

Exercice

NB : la relation Fournisseur-Produit est une

relation unidirectionnelle

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

37

Figure 1 : Diagramme de classes gestion

Magasin/Stock

SPRING DATA JPA – Première Entitié

Si vous avez des questions, n’hésitez pas à nous

contacter :

Département Informatique

UP Architectures des Systèmes d'Information

Bureau E204

© 2021-2022 – ESPRIT – ARCHITECTURE DES SI II SPRING – Spring Data JPA – 1ere Entité

38