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 :

Héritage "est un"


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut Héritage "est un"
    Bonjour,

    J'ai un petit soucis là, j'ai du mal à mapper le problème suivant (j'dois mal m'y prendre)

    Prenons 3 entités (c'est un exemple, mais l'idée est là) :
    Personne
    Peintre
    Carreleur

    Un peintre est une personne.
    Un carreleur est une personne.
    Une personne peut être un peintre ET un carreleur.
    Une personne peut aussi n'être rien du tout (juste une personne, sans "rôle" particulier)

    Illustration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    table personne     table peintre     table carreleur
    id                      id                     id
    1                        1                      2          
    2                        4                      4 
    3                                               5                      
    4
    5

    Comment je mappe ça avec JPA ?

    J'ai essayé de la manière suivante, mais c'est pas bon, puisque chaque entrée est unique (un peintre ne peut pas être un carreleur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    public class Personne extends AbstractEntity
     
    @Entity
    public class Peintre extends Personne
     
    @Entity
    public class Carreleur extends Personne
    Bien évidemment si j'essaye de faire ça, c'est parce que la personne a ses méthodes propres, le peintre aussi et le carreleur également...

    Mais j'm'y prends ptete mal, y'a ptete un design pattern qui réponds mieux que l'héritage à ce problème ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2007
    Messages : 165
    Par défaut
    Tu dois placer cette annotation avant la définition de la classe Personne
    Essayes de réviser tes cours d'héritage

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut


    C'est pas ça que j'essaye de faire.
    Par correction, j'ai quand même essayé, au cas où. L'annotation @MappedSuperclass est utile notamment pour définir une classe utilitaire comme je le fais avec la "AbtractEntity".

    Je cite la doc d'hibernate à ce sujet :
    This is sometimes useful to share common properties through a technical or a business superclass without including it as a regular mapped entity (ie no specific table for this entity). For that purpose you can map them as @MappedSuperclass.

    Ce n'est pas ce que j'essaye de mapper, puisque je veux inclure la classe Personne. Une personne peut très bien exister dans mon système sans avoir les propriétés additionnelles d'un peintre ou d'un carreleur. Et c'est bien ça mon problème, j'essaye de stocker dans Personne toutes les propriétés d'une personne, puis dans les tables filles, toutes les propriétés additionnelles d'une personne quand en plus, elle "est" un peintre.

    Note : j'ai pris un exemple trivial, ce n'est bien évidemment pas le cas réel.


    L'autre solution expérimentée est de ne pas avoir d'héritage. Dans ce cas, les tables "carreleur" et "peintre", sont de fait des tables de liaisons many-to-many avec par exemple une table "ouvrage".
    Ce qui me chagrine un peu dans ce cas de figure, c'est que je perds la notion "est-un". Dans mon cas justement, elle est très importante.

  4. #4
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Un peintre est une personne.
    Un carreleur est une personne.
    Une personne peut être un peintre ET un carreleur.
    Une personne peut aussi n'être rien du tout (juste une personne, sans "rôle" particulier)
    Ce que tu décris là ce n'est pas de l'héritage. "Carreleur" et "Peintre" doivent plutôt être des rôles (métier ?), associés à une personne ; chaque personne a un ou plusieurs rôles (par exemple dans ta classe Personne, tu auras une liste de rôles).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut
    Oui c'est un peu ça. Sauf que là, j'ai pris un exemple trivial, qui n'a rien à voir avec le cas réel.

    Dans mon cas, un Carreleur EST une personne, une personne "étendue".
    Pour être clair, ma personne peut avoir près de 10 rôles en même temps dans la base. Sauf que chacun de ces rôle est une entité à part entière. Chaque rôle à des associations et des méthodes qui lui sont propres.

    Je conçois bien que l'héritage n'est pas le plus adapté, j'essaye simplement de remplacer la solution bancale actuelle par quelque chose de plus propre.

    Note pour plus tard : ne plus donner des exemples pseudos-concrets

  6. #6
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Je conçois bien que l'héritage n'est pas le plus adapté, j'essaye simplement de remplacer la solution bancale actuelle par quelque chose de plus propre.
    À mon avis, il faudra éviter l'héritage. L'exemple n'étant pas correct, je pourrai pas te donner d'autres pistes.

Discussions similaires

  1. Manipulations binaires : savoir si un bit est "set"
    Par DiGiTAL_MiDWAY dans le forum Général Python
    Réponses: 2
    Dernier message: 18/09/2005, 16h42

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