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 :

Intérêt d'une entité embarquée ?


Sujet :

JPA Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 179
    Par défaut Intérêt d'une entité embarquée ?
    Bonjour,

    dans le livre Java que je suis en train de lire comme sur beaucoup d'exemples sur le net également, je remarque souvent l'utilisation d'une entité embarquée (avec @Embeddable et @Embedded). L'exemple type est celui d'une personne embarquant une entité adresse et formant donc une table unique personne en bdd.

    Un exemple ici

    L'intérêt est apparemment de pouvoir utiliser l'entité adresse dans une autre classe. Mais dans quel cas cela peut il arriver ? Et pourquoi ne pas directement récupérer l'entité personne et via les accesseurs accéder à son adresse ?

    Je n'arrive pas à comprendre l'intérêt des entités embarquées

    Quelqu'un peut il m'expliquer ?

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 130
    Par défaut
    L'interet, c'est que tu travailles sur de la persistance de données.

    Les classes annotées par @Entity ont donc pour finalité d'être persistées en base de données.
    Tous les membres de cette classes deviennent donc des champs possibles en base. JPA gère tous les types par défaut (int, boolean, String, ...) pour créer les champs.

    Or si tu lui spécifier comme membre un Classe à toi, JPA ne sais pas comment créer ce champ.
    Il incombe au développeur de faire un choix, comment stocker cette donnée :

    Prenons le cas de l'entité Personne qui contient un membre Adresse :
    Choix 1 : Adresse est annoté par l’annotation @Entity, chaque entité aura sa propre table en base soit 2. Donc pour avoir accès à l'Adresse d'une personne, il faudrait faire une relation entre les 2 tables (entités) : @ManyToMany, @OneToMany, ...
    Choix 2 : Adresse est annoté par l’annotation @Embeddable, seul l'entité Personne sera persisté en base. En précisant l'annotation @Embedded sur le membre Adresse de la classe Personne, ont dit à JPA : "intègre les champs de cette entité (Adresse) à l'intérieur de l'entité en cours (Personne)".
    Avec @Embeddable tu n'as donc qu'une seule table en base qui contient les champs des 2 classes.

    Cela permet d'améliorer le modèle objet sans pour autant modifier le comportement en base...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 179
    Par défaut
    Bonjour et merci de ta réponse

    Citation Envoyé par Aure7780 Voir le message
    Cela permet d'améliorer le modèle objet sans pour autant modifier le comportement en base...
    En quoi stp...?

    J'ai bien compris le principe des annotations, des relations etc...par contre je vois pas en quoi cela simplifie les choses d'utiliser une classe embeddable.
    En effet, le but est de créer une seule table donc pourquoi scinder en 2 classes côté JPA ?

    Le seul intérêt serait d'utiliser la classe Adresse dans une autre classe JAVA mais je vois pas dans quel contexte cela serait utile. Quand bien même cela serait utile, un simple personne.getRue(), personne.getNumero() etc ferait l'affaire...non ?

    Il doit y avoir un intérêt...mais je vois pas

  4. #4
    Membre émérite

    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2005
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2005
    Messages : 588
    Par défaut
    Citation Envoyé par jecomprendsrien Voir le message
    Il doit y avoir un intérêt...mais je vois pas
    D'un côté tu fais de l'objet avec JPA.. de l'autre un modèle relationnel pour la base de données... Bref, 2 modèles de données différents avec des contreintes et des objectifs qui peuvent s'opposer... Côté Java ton objet adresse est un objet métier qui peut te servir pour ton entité Personne où à toute autre objet de ton modèle indépendamment de Personne. Côté BDD, si ton entité adresse n'est utilisée que dans ton entité Personne tu peux souhaiter l'intégrer directement dans Personne... ici, dans ton modèle BDD, tu perds en design objet mais tu peux y gagner en performance et/ou en conception pour tes requêtes.
    a+
    Philippe

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 179
    Par défaut
    Bonjour Philippe,

    Citation Envoyé par Philippe Bastiani Voir le message
    Côté Java ton objet adresse est un objet métier qui peut te servir pour ton entité Personne où à toute autre objet de ton modèle indépendamment de Personne
    certes, mais ce que je comprends pas c'est quel intérêt a t-on à avoir d'un côté soit :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String rue = personne.getAdresse().getRue();

    dans le cas donc d'une entité Adresse embarquée ou bien :

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String rue = personne.getRue();

    dans le cas d'une entité Personne n'embarquant pas de classe Adresse ?

    Il est vrai que le fait de pouvoir récupérer une adresse directement d'une personne peut apporter plus de souplesse mais finalement quel intérêt puisque le but d'une entité est d'être persistée en base et donc il nous faudra bien peupler à un moment ou un autre tous les champs de notre entité personne.

    Merci de vos éclairages encore

  6. #6
    Membre émérite

    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2005
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2005
    Messages : 588
    Par défaut
    Côté Java/JPA: L'interêt
    - c'est de pouvoir conserver un modèle objet; et, non pas un modèle à plat où tu ressemble tous tes attributs dans un même objet.
    - c'est de pouvoir détacher l'objet adresse de son conteneur,
    - etc

    Côté BDD/relationel: c'est de s'affranchir de cette conception objet pour avoir un modèle relationnel ! dans ton exemple, si le cycle de vie de ton adresse est totalement lié à son contener... tu peux ressembler les 2 tables en une.

    a+
    Philippe

Discussions similaires

  1. [DOM] [Xerces] Insertion d'une entité
    Par Traroth dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 19/05/2008, 10h28
  2. une entité dépend d'elle même
    Par Danger dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 23/05/2005, 17h34
  3. mettre une entité date ou pas??
    Par faayy dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 12/04/2005, 10h00
  4. mettre une entité date ou pas et surtout comment!!!
    Par faayy dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/04/2005, 09h54
  5. [MCD]Faut-il une Entité Date ?
    Par Francis dans le forum Schéma
    Réponses: 2
    Dernier message: 17/01/2005, 19h48

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