La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Relations avec les entity beans Michel Buffa UNSA

Copies: 2
Relations avec les entity beans Michel Buffa UNSA

Persistance dans Java EE 6 : JPA2 et EJB 3.1 Michel Buffa UNSA

Présentations similaires


Présentation au sujet: "Relations avec les entity beans Michel Buffa UNSA"— Transcription de la présentation:

1 Relations avec les entity beans Michel Buffa UNSA

2 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

3 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 !

4 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

5 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…

6 Cardinalité

7 Relations 1:1 Représentée typiquement par une clé étrangère dans une BD Ex : une commande et un colis

8 Relations 1:1, le bean Order

9

10 Relations 1:1, le bean Shipment

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

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

13 Version bidirectionnelle (on modifie Shipment)

14 Version bidirectionnelle (suite)

15 Version bi-directionnelle (suite, code qui fait le persist) On peut maintenant ajouter au code de tout à lheure (celui qui écrit une commande) :

16 Version bi-directionnelle (suite, code du client)

17 Relations 1:N Exemple : une entreprise a plusieurs employés

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

19 Relations 1:N exemple

20

21 Exemple de code qui insère des compagnies

22 Exemple de code qui liste des compagnies

23 Exemple de client

24 Version bidirectionnelle

25

26

27 Relations M:N Un étudiant suit plusieurs cours, un cours a plusieurs étudiants inscrits Table de jointure nécessaire.

28 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…

29 Relations M:N, exemple

30

31

32

33

34 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é

35 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.

36 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 daccès BD à travers le bean Cours.

37 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..

38 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 dune 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

39 Relations et JPQL On peut aller plus loin… SELECT o.customer.address.homePhoneNumber FROM Order o On se promène le long des relations…

40 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…

41 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…

42 Relations circulaires Plusieurs stratégies sont possibles 1. 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.

43 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é.

44 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 !

45 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 !!!

46 Trier les relations Lorsquon accède aux relations par un getter, on ne contrôle pas par défaut lordre des éléments. Plusieurs solutions sont possibles pour récupérer des relations sous forme de collections triées Utiliser juste avant la déclaration de la relation ou juste avant le getter Utiliser une requête avec un Order By Annoter lattribut correspondant à la colonne qui sera ordonnée, dans lentity de la relation

47 Trier des relations public class ASC") List students;... }EntityManyToManyOrderBy Remarques ASC ou DESC pour lordre de tri, ASC par défaut, lastname est une propriété de lentité Student.java, Si la propriété nest pas spécifiée -> tri par lid

48 Trier des relations public class // tri par clé primaire (défaut) List courses;... }EntityManyToManyOrderBy Remarques ASC ou DESC pour lordre de tri, ASC par défaut, lastname est une propriété de lentité Student.java, Si la propriété nest pas spécifiée -> tri par lid

49 Trier des relations : On peut utiliser lopérateur «. » si on trie sur une colonne qui est définie dans une autre public class zipcode.plusFour") Set residences;... } EntityElementCollectionOrderBy

50 Trier des relations public class Address { protected String street; protected String city; protected String Zipcode zipcode; } public class Zipcode { String zip; protected String plusFour; } Embeddable

51 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 dAdresses (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…

52 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

53 Relation 1-N unidirectionnelle non partagée Si on supprime un élément de la collection, une adresse, et que lobjet personne est « managé » donc synchronisé avec la BD Une ligne dans la table de jointure est supprimée, Ladresse nest pas supprimée Si on est en CascadeType.REMOVE ou CascadeType.ALL alors : Ladresse est supprimée également Attention, que si elle nest pas partagée !!!

54 Relation 1-N bi-directionnelle non partagée

55 A part quon 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 ladresse nest pas supprimée, Si on est en CascadeType.REMOVE ou CascadeType.ALL alors la ligne de ladresse est supprimée dans la table des adresses.

56 Cas des relations partagées On ne peut pas supprimer une relation partagée, donc comment faire ? Avant de la supprimer de la collection, sassure quelle nest pas partagée, Si elle lest, voir si il ne faut pas dabord supprimer lentité qui la partage… Attention aux destructions en cascade !!!!

57 Cas des relations partagées Si on est en CascadeType.REMOVE ou CascadeType.ALL la suppression dune personne implique la suppression dune adresse, ce qui peut aussi donner des erreurs. Solution: utiliser lattribut 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.

58 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 lattribut orphanRemoval=true si on ne veut pas de données orphelines.


Télécharger ppt "Relations avec les entity beans Michel Buffa UNSA"

Présentations similaires


Annonces Google