S1 Sesame
S1 Sesame
S1 Sesame
Cours 1
Introduction aux
Architectures en couche
(JEE)
Année universitaire 2020/2021
1
IEEE1471
2
Comment assurer?
3
Architecture Multi-couches
4
Architecture Multi-couches
Couche Données: Cette couche présente la gestion
des données, tel qu’elle contient le modèle de la base
de données.
5
Architecture Multi-couches
6
Architectures distribuées
7
ARCHITECTURE JAVA ENTREPRISE
EDITION : JEE
8
9
SERVICES D’INFRASTRUCTURES
10
JDBC
JDBC (Java Data Base Connectivity) : Pilotes java
pour permettre ’accès aux bases de données.
Chaque SGBD possède ses propores pilotes JDBC.
11
Gestion des données
12
JPA (Java Persistence API)
On stocke l'état d'un objet dans une base de donnée.
– Ex : la classe Personne possède deux attributs nom et
prenom. on associe cette classe à une table qui possède
deux colonnes : nom et prenom.
13
JPA (Java Persistence API)
14
JPA (Java Persistence API)
JPA 2 propose un modèle standard de persistance à
l’aide des Entity beans
15
JPA (Java Persistence API)
16
JPA (Java Persistence API)
Interface qui permet de gérer la persistance des Entity
d’une application
définit un ensemble d’annotations qui permettent
d’effectuer le Mapping objet relationnel (ORM).
définit également une interface de gestion de la
persistance des entités, dans un context
transactionnel, appelée EntityManager.
Le serveur d’application fournie un Framework
implémentant la spécification JPA pour assurer le
mapping objet relationnel (Pour JBOSS c’est Hibernate
qui est utilisé)
17
JPA (Java Persistence API)
18
Exemple
package metier.entities;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
@Entity
@Table(name="COMPTES")
public class Compte implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="CODE")
private Long code;
@Column(name="SOLDE")
private double solde;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="DATE_CREATION")
private Date dateCreation;}
19
Application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/db_banque
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database=MYSQL
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming.strategy=org.hibernet.cfg.ImprovedNamingStr
ategy
spring.jpa.properties.hibernet.dialect=org.hibernet.dialect.MySQL5Dialect
20
JPA (Java Persistence API)
Pour qu’une classe puisse être persistante, il faut
21
JPA (Java Persistence API)
Une entité doit avoir un attribut qui correspond à la
clé primaire de la table associée
La valeur de cet attribut ne doit jamais être modifiée
L’attribut clé primaire est désigné par l’annotation
@Id
Le type de la clé primaire doit être d’un des types
suivants:
o type primitif Java
o java.lang.String
o java.util.Date
o java.sql.Date
22
JPA (Java Persistence API)
Possibilité de générer automatiquement les clés
Si la clé est de type numérique
o @GeneratedValue indique que la clé sera
automatiquement générée par le SGBD
l’annotation peut avoir un attribut strategy qui
indique comment la clé sera générée
o AUTO: le SGBD choisit (valeur par défaut)
o SEQUENCE: il utilise une séquence SQL
o IDENTITY: il utilise un générateur de type
IDENTITY (auto increment dans MySQL par
exemple)
o TABLE: il utilise une table qui contient la
prochaine valeur de l’identificateur 23
JPA (Java Persistence API)
Paramétrage en utilisant l’annotation @Column
Attributs de @Column
o name(): nom de l’attribut
o unique(): la valeur est-elle unique ?
o nullable(): accepte une valeur nulle ?
o insertable(): autorise ou non l’attribut à être mis à
jour
o columnDefinition(): définition DDL de l’attribut
o table(): lorsque l’attribut est utilisé dans plusieurs
tables
o length(): longueur max
o precision(): précision pour les valeurs numériques
24
JPA (Java Persistence API)
25
JPA (Java Persistence API)
Annotations supplémentaires
26
JPA (Java Persistence API)
Clé composite
Relation existante avec clé multi-attributs
Relation avec association N-M (Many-to-Many)
2 possibilités
o @IdClass: correspond à plusieurs attributs Id dans la
classe entité
o @EmbeddedId et @Embeddable: un seul attribut Id dans la
classe entité
Dans les 2 cas, la clé doit être représentée par une
classe Java
o les attributs correspondent aux composants de la clé
o la classe doit être publique
o la classe doit avoir un constructeur sans paramètre
27
JPA (Java Persistence API)
@EmbeddedId
Correspond au cas où la classe entité comprend un
seul attribut annoté @EmbeddedId
La classe clé primaire est annotée par @Embeddable
28
Exemple
29
JPA (Java Persistence API)
@IdClass
Correspond au cas où la classe entité comprend
plusieurs attributs annotés par @Id
La classe entité est annotée par @IdClass qui prend
en paramètre le nom de la classe clé primaire
La classe clé primaire n’est pas annotée ses
attributs ont les mêmes noms et mêmes types que
les attributs annotés @Id dans la classe entité
30
JPA (Java Persistence API)
Associations
o Une association peut être uni- ou bi-directionnelle
o Cardinalités: 1-1, 1-N, N-1, M-N
o Elles sont définies grâce à une annotation sur la
propriété Correspondante
31
JPA (Java Persistence API)
Association 1-1
Annotation @OneToOne
Représente la clé étrangère dans la table
32
JPA (Java Persistence API)
Associations 1-N et N-1
Annotations @OneToMany et @ManyToOne
Représentée par une clé étrangère dans la table qui
correspond au côté propriétaire (obligatoirement le
côté Many)
33
JPA (Java Persistence API)
ManyToOne
34
JPA (Java Persistence API)
Associations M-N
36
JPA (Java Persistence API)
37
JPA (Java Persistence API)
Collections de types simples
38
JPA (Java Persistence API)
Collections de types embeddables
39
JPA (Java Persistence API)
Persistance des entités associées
Lorsqu’un objet o est rendu persistant, les objets
référencés par o devraient être rendus persistants
(persistance par transitivité)
cohérence
par exemple, que se passe-t-il si un objet supprimé
est référencé par un autre objet ?
o JPA n’effectue pas de persistance par transitivité
par défaut
• plus de souplesse
• possibilité d’avoir la persistance par transitivité
avec cascade
40
JPA (Java Persistence API)
Attribut cascade
@OneToMany(cascade=CascadeType.PERSIST)
41
JPA (Java Persistence API)
Récupération des entités associées
Lorsqu’une entité est récupérée (requête), est-ce
qu’on récupère aussi les entités associées ?
JPA laisse le choix de récupérer ou non les entités
associées
o on peut choisir le mode de récupération: LAZY ou
EAGER
• EAGER: immédiat
• LAZY: à la demande
42
Exemple
On souhaite créer une application qui permet de
gérer des comptes bancaire.
◦ Chaque compte est défini un numéro, un solde et
une date de création
◦ Un compte courant est un compte qui possède en
plus un découvert
◦ Un compte épargne est un compte qui possède en
plus un taux d’intérêt.
◦ Chaque compte appartient à un client et créé par
un employé.
◦ Chaque client est défini par son code et son solde
◦ Un employé est défini par son code et son nom.
43
Exemple
◦ Chaque employé possède un supérieur hiérarchique.
◦ Chaque employé peut appartenir à plusieurs groupes
◦ Chaque groupe, défini par un code et un nom, peut
contenir plusieurs employés.
◦ Chaque compte peut subir plusieurs opérations.
◦ Il existe deux types d’opérations : Versement et
Retrait
◦ Chaque opération est effectuée par un employé.
◦ Une opération est définie par un numéro, une date et
un montant.
44
Exemple
45
Client
@Entity
public class Client implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long codeClient;
private String nomClient;
@OneToMany (mappedBy="client",
fetch=FetchType.LAZY, cascade=cascadeType.ALL)
private Collection<Compte> comptes;
46
Compte
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="Type_CPT",
discriminatorType=DiscriminatorType.STRING, length=2)
public abstract class Compte implements Serializable{
@Id
private String codeCompte;
private Date dateCreation;
private double solde;
@ManyToOne
@JoinColumn(name="Code_Cli")
private Client client;
@ManyToOne
@JoinColumn(name="Code_Emp")
private Employes employe;
@OneToMany( mappedBy="compte")
private Collection <Operation> operations; 47
CompteCC
@Entity
@DiscriminatorValue("CC")
48
CompteEP
@Entity
@DiscriminatorValue("CE")
public class CompteEP extends Compte{
49
Employees
@Entity
public class Employes implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long codeEmploye;
private String nomEmploye;
@ManyToOne
@JoinColumn(name="Code_emp_sup« )
private Employes EmployesSup;
@ManyToMany
@JoinTable(name="Emp_Gr", joinColumns=
@JoinColumn(name="Num_EMP", inverseJoinColumn=
@JoinColumn (name="Num_Groupe")))
private Collection<Groupe> groupes;
50
Groupe
@Entity
@Table(name="Groupes")
public class Groupe implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long codeGroupe;
@ManyToMany(mappedBy="groupes")
private Collection<Employes> employes;
51
Operation
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(length=1)
public class Operation implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long numeroOperation;
private Date dateOperation;
private double montant;
@ManyToOne
@JoinColumn(name="Code_CPT")
private Compte compte;
@ManyToOne
@JoinColumn(name="Code_Employe")
private Employes employe;
52
Retrait
@Entity
@DiscriminatorValue("R")
public class Retrait extends Operation {
53
Versement
@Entity
@DiscriminatorValue("V")
public class Versement extends Operation {
54