58
Relations avec les entity beans Michel Buffa (buff[email protected]), UNSA 2010

Relations avec les entity beans Michel Buffa ([email protected]), UNSA [email protected]

Embed Size (px)

Citation preview

Page 1: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations avec les entity beans

Michel Buffa ([email protected]), UNSA 2010

Page 2: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

On complique un peu l'étude des entity beans !

Les entity beans représentant des donnés dans une BD, il est logique d'avoir envie de s'occuper de gérer des relations

Exemples Une commande et des lignes de commande Une personne et une adresse Un cours et les élèves qui suivent ce cours Un livre et ses auteurs

Nous allons voir comment spécifier ces relations dans notre modèle Entity

Page 3: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Concepts abordés

Cardinalité (1-1, 1-n, n-n…),

Direction des relations (bi-directionnelles, uni-directionnelles),

Agrégation vs composition et destructions en cascade,

Relations récursives, circulaires, agressive-load, lazy-load,

Intégrité référentielle,

Accéder aux relations depuis un code client, via des Collections,

Comment gérer tout ça !

Page 4: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Direction des relations (directionality)

Unidirectionnelle On ne peut aller que du bean A vers le bean B

Bidirectionnelle On peut aller du bean A vers le bean B et

inversement

Page 5: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Cardinalité

La cardinalité indique combien d'instances vont intervenir de chaque côté d'une relation

One-to-One (1:1) Un employé a une adresse…

One-to-Many (1:N) Un PDG et ses employés…

Many-to-Many (M:N) Des étudiants suivent des cours…

Page 6: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Cardinalité

Page 7: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations 1:1

Représentée typiquement par une clé étrangère dans une BD

Ex : une commande et un colis

Page 8: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations 1:1, le bean Order

Page 9: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations 1:1, le bean Order

Page 10: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations 1:1, le bean Shipment

Page 11: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Exemple de code pour insérer une commande avec une livraison reliée

Page 12: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations 1:1, exemple de client (ici un main…)

Page 13: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Version bidirectionnelle (on modifie Shipment)

Page 14: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Version bidirectionnelle (suite)

Page 15: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Version bi-directionnelle (suite, code qui fait le persist)

On peut maintenant ajouter au code de tout à l’heure (celui qui écrit une commande) :

Page 16: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Version bi-directionnelle (suite, code du client)

Page 17: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations 1:N

Exemple : une entreprise a plusieurs employés

Page 18: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations 1:N

Exemple : une entreprise a plusieurs employés Solution plus propre (éviter les BLOBs!)

Page 19: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations 1:N exemple

Page 20: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations 1:N exemple

Page 21: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Exemple de code qui insère des compagnies

Page 22: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Exemple de code qui liste des compagnies

Page 23: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Exemple de client

Page 24: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Version bidirectionnelle

Page 25: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Version bidirectionnelle

Page 26: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Version bidirectionnelle

Page 27: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations M:N

Un étudiant suit plusieurs cours, un cours a plusieurs étudiants inscrits Table de jointure nécessaire.

Page 28: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations M:N, choix de conception

Deux possibilités lorsqu'on modélise cette relation avec des Entities

1. Utiliser un troisième Entity pour modéliser la table de jointure. On veut peut-être mémoriser la date où un étudiant s'est inscrit, etc… Cet Entity possèdera deux relations 1:N vers le bean Student et le vers le bean Course

2. Si on a rien besoin de plus à part la relation, on peut utiliser simplement deux Entity, chacun ayant un attribut correspondant à une Collection de l'autre Entity…

Page 29: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations M:N, exemple

Page 30: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations M:N, exemple

Page 31: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations M:N, exemple

Page 32: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations M:N, exemple

Page 33: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations M:N, exemple

Page 34: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

La directionalité et le modèle de données dans la DB

La directionalité peut ne pas correspondre à celle du modèle de données dans la DB

Schéma normalisé

Schéma dénormalisé

Page 35: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Choisir la directionalité ?

Premier critère : la logique de votre application,

Second critère : si le schéma relationnel existe, s'adapter au mieux pour éviter de mauvaises performances.

Page 36: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Lazy-loading des relations

Agressive-loading Lorsqu'on charge un bean, on charge aussi tous les beans

avec lesquels il a une relation. Cas de la Commande et des Colis plus tôt dans ce chapitre. Peut provoquer un énorme processus de chargement si le

graphe de relations est grand.

Lazy-loading On ne charge les beans en relation que lorsqu'on essaie

d'accéder à l'attribut qui illustre la relation. Tant qu'on ne demande pas quels cours il suit, le bean

Etudiant ne déclenche pas d’accès BD à travers le bean Cours.

Page 37: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Agrégation vs Composition et destructions en cascade

Relation par Agrégation Le bean utilise un autre bean Conséquence : si le bean A utilise le bean B, lorsqu'on détruit

A on ne détruit pas B. Par exemple, lorsqu'on supprime un étudiant on ne supprime

pas les cours qu'il suit. Et vice-versa.

Relation par Composition Le bean se compose d'un autre bean. Par exemple, une commande se compose de lignes de

commande… Si on détruit la commande on détruit aussi les lignes

correspondantes. Ce type de relation implique des destructions en cascade..

Page 38: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations et JPQL

Lorsqu'on définit une relation, on peut aussi indiquer la requête qui permet de remplir le champs associé à la relation.

On fait ceci à l'aide d’une requête JPQL

SELECT o.customer

FROM Order o

Principale différence avec SQL, l'opérateur "." Pas besoin de connaître le nom des tables, ni le

nom des colonnes…

Renvoie tous les clients qui ont placé une commande

Page 39: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations et JPQL

On peut aller plus loin…

SELECT o.customer.address.homePhoneNumber

FROM Order o

On se promène le long des relations…

Page 40: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations récursives

Relation vers un bean de la même classe Exemple : Employé/Manager

Rien de particulier, ces relations sont implémentées exactement comme les relations non récursives…

Page 41: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations circulaires

Similaire au relations récursives sauf qu'elles impliquent plusieurs types de beans Ex : un employé travaille dans une division, une division possède

plusieurs ordinateurs (workstation), une workstation est allouée à un employé…

Ce type de relation, en cas de agressive-loading peut mener à une boucle sans fin… Même problème avec les destructions en cascade…

Page 42: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations circulaires

Plusieurs stratégies sont possibles1. Si on charge toutes ses relations en cascades, attention si

relations circulaires !

2. Supprimer une des relations (!!!) si le modèle de conception le permet.

3. Supprimer la bidirectionnalité d'une des relations pour briser le cercle, si le modèle de conception le permet.

4. Utiliser le lazy-loading et ne pas faire de destruction en cascade.

5. Les meilleurs moteurs de persistence détectent les relations circulaires et vous permettent de traiter le problème avant le runtime.

Page 43: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Intégrité référentielle

Un bean Compagnie, Division, etc… a des relations avec un bean Employé Si on supprime un employé, il faut vérifier qu'il est

bien supprimé partout où on a une relation avec lui.

Problème classique dans les SGBDs Résolus à l'aide de triggers. Ils se déclenchent sitôt

qu'une perte d'intégrité risque d'arriver et effectuent les opérations nécessaires.

On peut aussi utiliser des procédures stockées via JDBC. Ces procédures effectuent la vérification d'intégrité.

Page 44: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Intégrité référentielle

Gérer l'intégrité dans le SGBD est intéressant si la BD est attaquée par d'autres applications que les EJBs…

Autre approche : gérer l'intégrité dans les Entités Solution plus propre, Le SGBD n'est plus aussi sollicité, Avec les Entités: le travail est fait tout seul !

Page 45: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Intégrité référentielle

Et dans un contexte distribué ?

Plusieurs serveurs d'application avec le même composant peuvent accèder à des données sur le même SGBD,

Comment mettre à jour les relations ?

Problème résolu par les transactions !!!

Page 46: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Trier les relations

Lorsqu’on accède aux relations par un getter, on ne contrôle pas par défaut l’ordre des éléments.

Plusieurs solutions sont possibles pour récupérer des relations sous forme de collections triées Utiliser l’annotation @OrderBy juste avant la

déclaration de la relation ou juste avant le getter Utiliser une requête avec un Order By Annoter l’attribut correspondant à la colonne qui sera

ordonnée, dans l’entity de la relation

Page 47: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Trier des relations : annotation @OrderBy

@Entity public class Course { ... @ManyToMany @OrderBy("lastname ASC") List<Student> students; ... }

Remarques ASC ou DESC pour l’ordre de tri, ASC par défaut, lastname est une propriété de l’entité Student.java, Si la propriété n’est pas spécifiée -> tri par l’id

Page 48: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Trier des relations : annotation @OrderBy

@Entity public class Student { ... @ManyToMany(mappedBy="students") @OrderBy // tri par clé primaire (défaut) List<Course> courses; ... }

Remarques ASC ou DESC pour l’ordre de tri, ASC par défaut, lastname est une propriété de l’entité Student.java, Si la propriété n’est pas spécifiée -> tri par l’id

Page 49: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Trier des relations : annotation @OrderBy

On peut utiliser l’opérateur « . » si on trie sur une colonne qui est définie dans une autre classe par @Embedded

@Entity public class Person { ... @ElementCollection @OrderBy("zipcode.zip, zipcode.plusFour") Set<Address> residences; ... }  

Page 50: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Trier des relations : annotation @OrderBy

@Embeddable public class Address { protected String street; protected String city; protected String state; @Embedded Zipcode zipcode; }  

@Embeddable public class Zipcode { String zip; protected String plusFour; } 

Page 51: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Supprimer des relations

Piège classique !

On ne peut pas supprimer une relation si elle est partagée par un autre objet. Ex: une classe Personne a une collection

d’Adresses (Adresse.java est une classe entité), on a une relation 1-N.

Si une de ces adresses est aussi en relation avec une autre Personne, il y a aura une erreur.

Voyons quelques exemples…

Page 52: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Supprimer des relations

Supposons que nous ne sommes pas dans le cas précédent. Les relations ne sont pas partagées…

Premier cas: on a une relation 1-N entre Personne et Adresse Normalement si on génère des tables à partir de

ces classes on a une table de jointure générée

Page 53: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relation 1-N unidirectionnelle non partagée

Si on supprime un élément de la collection, une adresse, et que l’objet personne est « managé » donc synchronisé avec la BD Une ligne dans la table de jointure est supprimée, L’adresse n’est pas supprimée

Si on est en CascadeType.REMOVE ou CascadeType.ALL alors : L’adresse est supprimée également Attention, que si elle n’est pas partagée !!!

Page 54: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relation 1-N bi-directionnelle non partagée

Page 55: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relation 1-N bi-directionnelle non partagée

A part qu’on a pas de table de jointure, le principe est le même que pour les exemples uni-directionnels. Si on supprime une adresse de la collection, alors

on va mettre à null la clé étrangère dans la table des ADRESSE, mais l’adresse n’est pas supprimée,

Si on est en CascadeType.REMOVE ou CascadeType.ALL alors la ligne de l’adresse est supprimée dans la table des adresses.

Page 56: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Cas des relations partagées

On ne peut pas supprimer une relation partagée, donc comment faire ? Avant de la supprimer de la collection, s’assure

qu’elle n’est pas partagée, Si elle l’est, voir si il ne faut pas d’abord supprimer

l’entité qui la partage…

Attention aux destructions en cascade !!!!

Page 57: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Cas des relations partagées

Si on est en CascadeType.REMOVE ou CascadeType.ALL la suppression d’une personne implique la suppression d’une adresse, ce qui peut aussi donner des erreurs.

Solution: utiliser l’attribut orphanRemoval=true

Cela ne va supprimer les adresses que si elles sont orphelines.

Sinon : ne pas faire de delete en cascade et gérer à la main.

Page 58: Relations avec les entity beans Michel Buffa (buffa@unice.fr), UNSA 2010buffa@unice.fr

Relations N-N

Cas similaires mais un peu plus compliqué

Ex: des cours et des élèves, comment supprimer un cours ou un élève

Solution recommandée : ne pas faire de delete en cascade utiliser l’attribut orphanRemoval=true si on ne veut

pas de données orphelines.