IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Association et objets inclus


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut Association et objets inclus
    Bonjour,

    Débutant en spécification JPA, je cherche à comprendre le mécanisme des objets inclus et des associations entre entités. Je suis entrain de suivre un tutoriel qui permet de réaliser une application de bibliothèque.
    Il est dit dans le tuto ceci concernant la règle de fonctionnement des emprunts de livres :

    "un Client peut effectuer un prêt de plusieurs Livres ; et comme un Livre a plusieurs exemplaires, il peut être emprunté par plusieurs Clients.
    Chaque prêt ayant une date de début et de fin à prendre en compte, on se retrouve dans une association porteuse de propriétés. "

    Voici un modèle UML à ma façon :

    Nom : Screenshot from 2020-07-17 14-21-29.png
Affichages : 860
Taille : 43,8 Ko

    Une chose m'échappe dans ce schéma : est-ce qu'il faut comprendre qu'un prêt appartient à un seul livre ? Du coup ça devient contradictoire avec l'énoncé, non ?

    Enfin une dernière question sur l'endroit où placer les annotations d'association : je vois dans certains exemples qu'elles sont tantôt au dessus des getters ou au-dessus des propriétés. Quelle est la différence ?

    Merci beaucoup.

  2. #2
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Plusieurs questions dans ce post.

    Pour la première (la classe prêt), tu as ce que l'on appelle (en UML) une classe d'association. Dans la base de données, cela se caractérisera par une table ayant une clé primaire sur deux id, chaque id étant une clé étrangère sur une des table (1 pour livre, l'autre pour client).

    D'ailleurs, je recommande plutôt @EmbeddedId (Meilleur lien trouvé: https://blog.axopen.com/2013/11/les-...c-hibernate-4/ ).

    Seconde question: Où mettre les annotations JPA?

    Le mettre sur les méthodes ou les attributs, dans les 2 cas c'est correct. D'ailleurs, JBoss recommande, il me semble les méthodes. Spring, dans mes souvenir, recommandait les attributs.

    En ce qui me concerne, je recommande les attributs. C'est un avis personnel.
    Je trouve ça plus lisible et on sait d’emblée que l'attribut correspond à un champ dans la BDD, ce qui évite de rechercher le setter.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Bonjour et merci pour votre réponse,

    Du coup pur le modèle merisien, cela donnerait quelque chose comme ceci ?

    Nom : Screenshot from 2020-07-24 09-13-48.png
Affichages : 737
Taille : 20,0 Ko

    Merci

  4. #4
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Non, il n'y a pas de clé étrangère dans livre (fk_id_pret) et client (fk_id_pret).

    De plus, en parlant Merise, on a un MCD ou un MCD?
    Le schéma ne correspond à rien.

    Pour être plus précis, il y a deux possibilités.
    1. Le client m’emprunte qu'une seule fois le livre. Dans ce cas, on a une double clé primaire (id_livre, id_client) qui sont des clés étrangères (sur id_livre de la table livre et id_client sur la table client).
    2. Le client emprunte le livre plusieurs fois. Dans ce cas, on a un id unique dans la table pret, et une clé étrangère dans la table livre (fk_livre) et une clé étrangère dans la table client (fk_client).

    Notez que j'ai différentié la clé primaire (id) de la clé étrangère (fk).

    Notez aussi que pour utiliser JPA/Hibernate à bon escient, il faut de bonnes connaissances de la BDD relationnelle ainsi que de ce que l'on appellera la théori des ORM (JPA est un ORM).

    C'est là où réside la difficulté de JPA/Hibernate.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Merci encore,

    du coup j'ai distingué le MCD du MLD selon vos explications pour essayer d'être plus rigoureux même si j'ai du mal à comprendre les 2 possibilités d'emprunt d'un livre une seule fois ou plusieurs fois.
    D'ailleurs comment est-il possible d'avoir une clé étrangère livre dans la table livre et idem pour client ?

    Voici ce que donne mon MLD, je crée une clé primaire composée de l'id de la table livre et client. Cela répond au fait que :
    - 1 livre (qui existe en plusieurs exemplaires) peut-être emprunté au moins une fois
    - 1 prêt est composé d'au moins 1 livre
    - 1 prêt concerne un client
    - 1 prêt concerne un livre

    Nom : Screenshot from 2020-07-24 16-55-34.png
Affichages : 712
Taille : 33,5 Ko

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Pour répondre à ton problème de compréhension...
    Un prêt concerne 1 instance de livre et 1 instance de client.
    Un client peut emprunter plusieurs fois la même référence de livre vu qu'il existe plusieurs mêmes livres au sens d'une référence littéraire (ils auront chacun leur propre clé primaire, ce ne sont pas les mêmes instances).
    Ce serait le cas d'une personne empruntant pour une autre bibliothèque (avoir une seule fois un livre à succès risque d'étaler un peu trop les emprunts des consommateurs, d'où l'intérêt d'en avoir plusieurs identiques).

    Sinon, personnellement, je préfère les annotations sur les getter, ça évite de surcharger les propriétés de l'entity (ce que PhilippeGibault voit comme un avantage me paraît un inconvénient, mais comme il l'a dit, les 2 fonctionnent, c'est surtout une question de feeling ).
    Par contre, il faut savoir qu'il y a une différence à l'exécution. Avec un AccessType PROPERTY (le défaut et recommandé), le chargement/mise à jour se fait via les getter/setter. En utilisant AccesType FIELD, l'opération se fait directement par les champs.

    Enfin, personnellement toujours, je ne conseille pas de mettre les Set liés à la table de relation dans les entités Livre et Client, ça n'a pas d'intérêt du point de vue persistance et presque aucun intérêt du point de vue requête pour l'IHM.
    Ça risque juste de ralentir les accès à un livre ou un client (sauf à mettre un FetchType LAZY).

    Je préconise toujours de voir le modèle entity d'un point de vue "gestion" des tables et non du point de vue d'une fonctionnalité IHM (rechercher les livres empruntés par un client etc...).
    Si on recherche les livres empruntés par un client pour une plage de dates données, il est beaucoup plus judicieux de faire un Query sur la table de relation, laquelle devrait avoir des relations ManyToOne vers les entités Livre et Client.
    Du coup, via les instruction join fetch, on peut charger les informations liées dans la requête JPQL (select a from Pret a join fetch a.livre where ...)
    L'autre intérêt de ce mapping serait de persister via l'entity Pret un livre et/ou un client inexistant (voir l'attribut cascade sur la relation ManyToOne) au moment de la demande (même si ça n'a pas forcément un intérêt dans ton cas, il faut savoir que c'est possible).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/10/2008, 11h03
  2. Réponses: 6
    Dernier message: 09/04/2008, 09h57
  3. Treeview: associé un objet à chaque Item ?
    Par TSalm dans le forum Framework .NET
    Réponses: 2
    Dernier message: 29/10/2007, 16h57
  4. Association entre objet Id ou référence ?
    Par grosFab dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 19/04/2007, 13h41
  5. [JNI] : Obtenir les champs d'un objet inclus dans un objet
    Par jojo29 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 27/04/2006, 13h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo