Spring 2022 Jpa
Spring 2022 Jpa
Spring 2022 Jpa
JPA/Hibernate
Spring Data
1 Présentation
Jakarta Persistence API
• JPA est une abstraction de la couche JDBC, les classes et les annotations JPA sont dans le package
javax.persistance (jakarta.persistence).
• JPA 1.0 a été introduite dans la spécification JAVA EE 5, la spécification Jakarta EE 9 supporte la version
JPA 3.0
• Composants:
– ORM: mécanisme de mapping relationnel objet
– L’API Entity Manager qui gère les opérations CRUD
– JPQL : langage de requête orienté objet.
– JTA (Jakarta Transaction API ) : Mécanisme de gestion des verrouillages et des transactions dans un
environnement concurrent
package spring.cours.jpa.model;
public void setId(int id) {
import javax.persistence.Entity; this.id = id;
import javax.persistence.Id; }
• @Column permet de déterminer les propriétés d’une colonne dans la table associée.
• Principales propriétés de l’annotation column :
Propriété Valeur par défaut
name Nom de l’attribut
nullable True
Length (String) 255
unique False
@Entity
@Table(name="users")
public class Utilisateur {
@Id
private int id;
@Column(nullable = false, name = "username", length = 60)
private String nom;
@Column(unique = true)
private String email;
// get, set
}
6- Auto incrément
}
Exemple 2: Une table par classe
Exemple 3: Joined
Hibernate DDL
La propriété spring.jpa.hibernate.ddl-auto
définit le mode de génération de la base de
données par Hibernate, valeurs:
– create
– create-drop: à chaque démarrage la base de
données est créée puis supprimée.
– update : mise du schéma de la base de
données (si c’est possibe)
– none : valeur par défaut (à utiliser en
production).
Associations
La spécification JPA supporte trois types d’association :
One to one
Many to one / One to Many
Many to Many
Les trois types d’association peuvent être unidirectionnelles (navigables dans un sens)
ou bidirectionnelles (navigables dans les deux sens), la navigabilité impacte l’utilisation
des classes dans le programme et non pas les tables générées dans la base de
données.
@ManyToOne
L’association ManyToOne est la plus utilisée dans la pratique, dans la classe Produit on
ajoutera un attribut de type Categorie.
Categorie Produit
@Entity @Entity
@Id @Id
@GeneratedValue(strategy=GenerationType
@GeneratedValue(strategy = .IDENTITY)
GenerationType.IDENTITY)
private long reference;
private long catId;
private String designation;
private String libelle;
private double prix;
@ManyToOne
}
…
}
@OneToMany
Navigabilité : Catalogue Produit
Catalogue
@Entity
Par défaut l’annotation ManyToOne génère une table
public class Catalogue {
association ( ce qui est souhaité dans notre exemple
@Id
@GeneratedValue(strategy =
) , pour généré une clé étrangère dans la table
GenerationType.IDENTITY) Produit, il faut ajouter l’annotation JoinColumn pour
private long id; définir le nom de la clé étrangère dans la table
private String titre;
produit :
@OneToMany
private List<Produit>
produits=new ArrayList<>();
…}
ManyToMany
•la navigabilité Produit Magasin
@ManyToMany(mappedBy = "produits")
private List<Magasin> magasins=new ArrayList<>();
Ce qui permettra d’accéder aux magasins à partir d’un produit p.getMagasins()
JPQL
Exemple de requêtes:
SELECT * SELECT p
FROM produit FROM Produit p
WHERE prix > 100 WHERE p.prix > 100
ORDER BY designation; ORDER BY p.designation