Académique Documents
Professionnel Documents
Culture Documents
// Ajout User :
public void addUser(User user);
// Suppression User :
public void removeUser(User user);
// Récupération User :
public User getUserById(int id);
User user2 = new User(4, "", "", "", "", "", "");
userDAOImpl.removeUser(user2);
}
}
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.
ORM
12
Sans
ORM
Avec
ORM
13
Introduction JPA
14
15
Vocabulaire JPA
16
Persistance/persister:
Action de sauvegarder des données dans une base de données (SGBD).
Correspondance objet – relationnel (mapping Objet/Relationel)
Les attributs d'un objet sont enregistrés sur un support persistant
19
La mise en œuvre
Les entités JPA - Développement
21
Une entité JPA est une classe JAVA qui doit satisfaire les
conditions suivantes :
Être déclarée avec l'annotation @Entity.
chaque Entity est mise en correspondance avec une table.
par défaut une table avec le même nom que la classe
sauf si on utilise l’annotation @Table(name="...")
Posséder au moins une propriété déclarée comme identité de
l’entité avec l'annotation @Id (clé primaire).
Implémenter l’interface java.io.Serializable.
21
Tous les attributs doivent être « private » ou « protected »et
avoir obligatoirement des accesseurs et des mutateurs (les
méthodes getters et setters).
Les entités JPA - Développement
22
Les entités JPA - Développement
24
Exemple 1:
Les entités JPA - Développement
24
Exemple 2:
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 = "T_EMPLOYEE")
public class Employee implements Serializable {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column(name="EMPL_ID")
private int id; // Clé primaire
@Column(name="EMPL_NAME")
private String name;
Exemple 3:
@Entity
public class Personne implements Serializable {
}
Les entités JPA - Développement
26
Exemple 4:
27
Les entités JPA: Annotation
28
Exemple 2:
Correspondance attributs et colonnes.
Annotation @Table et @Column.
@Entity @Entity
@Table(name="ECRIVAINS") @Table(name="LIVRES")
public class Auteur { public class Ouvrage {
@Column("NOM_ID") @COLUMN("TITRE_ID")
String nom; String titre;
List<Ouvrage> oeuvres; Auteur auteur;
// constructeur // constructeur
// getter/setter nom // getter/setter titre 28
// getter/setter oeuvres // getter/setter auteur
} }
Stratégies d’auto génération des IDs
29
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column(name="EMPL_ID")
private int id; // Clé primaire
29
Stratégies d’auto génération des IDs
30
Si l’ID est de type String, int, byte, char, double, float, long ou
short, l’insertion de l’id peut se faire automatiquement par l’une
des stratégies suivantes :
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: La génération de la clé primaire se fait
à partir d’une identité propre au SGBD. Il utilise un type de colonne spéciale à la base
30
de données.
Exemple pour MySQL, il s’agit d’un AUTO_INCREMENT. Avec PostgreSQL ou Oracle,
c’est une séquence.
Stratégies d’auto génération des IDs
31
31
Stratégies d’auto génération des IDs
32
32
Stratégies d’auto génération des IDs
33
Exemple:
1-
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
@Column(name="EMPL_ID")
private int id; // Clé primaire
@Id
@Column(name="EMPL_ID")
private int id; // Clé primaire
https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#basic
Les dates
35
35
Les énumérations
36
@Enumerated :
EnumType.String: Si la valeur de l’attribut va être stockée dans la base de
données sous forme de String qui représente la valeur de l’énumération.
EnumType.Ordinal: Si la valeur de l’attribut va être stockée dans la base
de données sous forme d’un Integer qui représente la valeur de
l’énumération.
36
Classe Embeddable
37
@Embeddable :
Il existe aussi des classes « insérées » ou « incorporées » (embedded)
dont les données n’ont pas d’identité dans la BD mais sont insérées
dans une des tables associées à une entité persistante.
Clé composite
38
Dans les 2 cas, la clé primaire doit être représentée par une
classe Java dont les attributs correspondent aux composants de
la clé primaire.
38
La classe doit être public, posséder un constructeur sans
paramètre, être sérialisable et redéfinir equals et hashcode.
Clé composite avec @IdClass
39
39
Clé composite avec @EmbeddedId
40
40
Héritage
41
45
TP1: Création de la premiere entité
46
Vous aurez:
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 5.6.17 MySQL Community Server (GPL)
mysql> create database imputation;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| imputation |
mysql> use imputation;
Database changed
mysql> show tables;
Empty set (0.00 sec)
TP1: Création de la premiere entité
47
Aller dans le fichier standalone.xml (de WildFly), et vérifier si vous avez une
DataSource qui permet de vous connecter à votre base de données
« imputation » ?
Nous allons créer cette DataSource. Il y a deux façons :
Méthode 1 : Modifier directement el fichier standalone.xml (risque d’erreur, à
ne pas faire).
Méthode 2 (conseillée) : Utiliser l’interface d’administration de WildFly. Voici la
démarche :
Démarrer votre WildFly (Plugin Server sur Eclipse), dans les logs vous trouverez
l’URL de la console d’administration :
WFLYSRV0051: Admin console listening on http://127.0.0.1:10990
Ouvrir la console d’administration : http://127.0.0.1:10990 (login admin / mot
de passe adminwidfly)
(Les captures d’écran sont sur les slides suivants:) Configuration -> Subsystems -
> Datasources -> View -> Add -> MySQL Datasource -> Name : ImputationDS
JNDI Name java:/ImputationDS -> Detected Driver -> mysql ->
jdbc:mysql://localhost:3306/imputation (ajouter login et password) -> Test
TP1: Création de la premiere entité
49
TP1: Création de la premiere entité
50
TP1: Création de la premiere entité
52
TP1: Création de la premiere entité
53
TP1: Création de la premiere entité
54
TP1: Création de la premiere entité
55
Revérifier standalone.xml :
TP1: Création de la premiere entité
57
http://repo.maven.apache.org/maven2/archetype-catalog.xml
<archetype>
<groupId>org.wildfly.archetype</groupId>
<artifactId>wildfly-javaee7-webapp-ear-blank-archetype</artifactId>
<version>8.2.0.Final</version>
<description>An archetype that generates a starter Java EE 7 webapp project for
JBoss Wildfly. The project is an EAR, with an EJB-JAR and WAR</description>
</archetype>
TP1: Création de la premiere entité
59
<jta-data-source>java:/MySqlDSJEE</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
</properties>
</persistence-unit>
</persistence>
TP1: Création de la premiere entité
65
@Entity
@Table(name="T_UTILISATEUR")
public class Utilisateur implements Serializable {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
@Column(name="UT_ID")
int id;
@Column(name="UT_NOM")
String nom;
@Column(name="UT_PRENOM")
String prenom;
@Column(name="UT_ADRESS_MAIL")
String adresseMail;
public Utilisateur() {}
public String getNom() {return nom;}
public void setNom(String nom) {this.nom = nom;}
public String getPrenom() {return prenom;}
public void setPrenom(String prenom) {this.prenom = prenom;}
public String getAdresseMail() {return adresseMail;}
public void setAdresseMail(String adresseMail) {this.adresseMail = adresseMail;}
}
TP1: Création de la premiere entité
69
Comment les Ids (les clés primaires) ont été générés dans chacun de ces
cas?
Exécuter la requête SQL : show table status;
TP1: Création de la premiere entité
70
TemporalType.DATE: la date va être sauvegardée dans la base de données sous forme d’une
date (jour, mois, année)
TemporalType.TIMESTAMP: la date va être sauvegardée dans la base de données sous forme
d’une date (jour, mois, année) + heure à la microseconde.
TemporalType.TIME: Un temps sur 24 heures (heures, minutes, secondes à la milliseconde près)
Date aujourdhui ;
@Temporal(TemporalType.TIMESTAMP)
public Date getDateNaissance(){
return aujourdhui;
}
TP1: Création de la premiere entité
71