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

avec Java Discussion :

Problème d'héritage avec une moitié de clé dans la classe parente et l'autre dans la classe fille


Sujet :

avec Java

  1. #1
    Membre averti Avatar de coshibe
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 183
    Points : 406
    Points
    406
    Par défaut Problème d'héritage avec une moitié de clé dans la classe parente et l'autre dans la classe fille
    Bnjour me revoilà à programmer après une longue pause et je galère un peu. Mon problème est que je dois créer une classe personne(instanciable) et une classe client qui doit pouvoir avoir plusieurs entités pour une meme personne. Pour etre plus clair, une personne peut avoir plusieurs entités clients mais un client n'est reliè qu'à une personne. j'ai donc décidé de faire une mappedsuperclass AbstractPersonne de sorte que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @MappedSuperclass
    @Table(name = "PERSONNE")
     
    public class AbstractPersonne   {
    @Id
    private String Id;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Entity
    public class Personne extends AbstractPersonne
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @Entity
    @Table(name="T_CLIENT")
    public class Client extends AbstractPersonne {
    Et là ou ej coince vraiment c'est que j'ai besoin de compléter la clé dans clients avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Entity
    @Table(name="T_CLIENT")
    public class Client extends AbstractPersonne {
    @Id
    private String NumClient;
    mais du coup hibernate considère que je la clé est juste NumClient et je deviens dingue. @Inheritance ne marche aps car les tables sont imposées donc pas de discriminator possible.

    Quelqu'un a une idée de comment m'en sortir pour faire cette clé composée pour dans ma classe client en appelant une partie depuis la mappedSuperClass?

  2. #2
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    au niveau du principe: est-ce vraiment correct de faire que Client hérite de Personne?
    Une délégation serait mieux venue qu'un héritage ..... et donc on aurait une table Client qui référencerait une Personne

  3. #3
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Idem pour moi... le client référence une personne, il n'en hérite pas...

    Pour la mise en oeuvre, je te conseille d'utiliser des clés primaires non parlantes (un incrémental est idéal) dans ta table Client et Personne...
    En fait, je te conseille d'utiliser des clés primaires de ce genre tout le temps

  4. #4
    Membre averti Avatar de coshibe
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 183
    Points : 406
    Points
    406
    Par défaut
    J'ai mis un peu de temps à répondre parce que je ne conaissais pas la délégation, ca c'est fait et j'ai l'impression que la délégation ne va pas pas pouvoir s'appliquer dans mon cas, apparement la délégation c'est surtout pour étendre en one to one.
    Par contre pour les clés non parlantes j'ai du mal à trouver de la doc, concretement je dois juste faire une référence à Personne dans ma classe Client c'est bien ca?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Entity
    @Table(name="T_CLIENT")
    public class Client  {
    @Id 
    private String NumClient;
    @Id
    private String PersonneId;
     
    private Personne p;

  5. #5
    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
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Pour les clés non parlantes type auto-incrément, la plupart des bases de données actuelles sont capables de le gérer, soit via une "séquence" (Oracle), soit directement sur la définition de champ id (MySQL, DB2)
    Dans le cas 2 (le plus simple), tu crées ta table comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE MA_TABLE (   
      UID INTEGER AS IDENTITY NOT NULL,
      ...
      PRIMARY KEY(UID)
    };
    Pour la séquence, regarde ici...

    Le principal avantage de ce type de clé, c'est de faciliter la référence externe et de s'abstraire de toutes contraintes sur les types de champs dans le cas de clés composites.
    Exemple :
    - une table Adresse, clé primaire [CODE CHAR(5), TYPE Integer]
    - une table Client, qui référence une adresse (elle contient donc 2 champs pour ça, un pour CODE, l'autre pour TYPE)

    Si la clé d'adresse change, il faudra modifier toutes les tables qui la référencent.
    Avec une clé numérique auto-incrémentée, seule la recherche d'une adresse sera impactée, une fois l'adresse trouvée, on utilise juste son UID.
    Même si le champ CODE passait de CHAR(5) à CHAR(10) ou si on ajoutait un troisième champ dans la clé primaire d'Adresse, la référence (et donc toutes les tables qui la référencent) resterait inchangée.

    Bref, pour moi (et bien d'autres), il y a 2 types de clés :
    - la clé primaire qui identifie un enregistrement d'une table et qui sert à référencer un enregistrement externe (foreign-key)
    - la clé "fonctionnelle", qui peut être unique aussi, qui sert à trouver un enregistrement de manière plus naturelle, mais qui ne devrait pas servir à référencer un enregistrement externe

  6. #6
    Membre averti Avatar de coshibe
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 183
    Points : 406
    Points
    406
    Par défaut
    Merci Obutterlin,

    Je comprends mieux ce qu'est une cle non parlante. Malheureusement l'ERP sur lequel je travaille ne me laisse pas cette liberté. Ma clé c'est "NUDOSS + NULIGN" et je ne peux pas changer ca. Je pense que je vais oublier l'heritage et utiliser une clé embarquée ce sera sans doute plus simple de ce que je vois.

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

Discussions similaires

  1. Problème d'héritage avec une classe abstraite
    Par Ph.denis dans le forum C++
    Réponses: 7
    Dernier message: 22/03/2008, 11h37
  2. Problème de requête avec une condition IN
    Par sorcer1 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/10/2005, 12h56
  3. problème de connexion avec une base firebird
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/05/2005, 12h40
  4. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 29/04/2005, 00h17
  5. Problèmes d'accent avec une connexion ODBC et ADO
    Par michael.jacques dans le forum Bases de données
    Réponses: 3
    Dernier message: 10/03/2005, 16h36

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