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

Persistance des données Java Discussion :

Mapping d'une table contenant plusieurs entités


Sujet :

Persistance des données Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2016
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2016
    Messages : 37
    Points : 37
    Points
    37
    Par défaut Mapping d'une table contenant plusieurs entités
    Bonjour les amis,

    Je suis face à un problème qui ne devrait pas être inconnu des dévelopeurs plus expérimentés

    Nous avons une table "code_list" qui contient des données comme ceci:

    id_code_list val_num val_string label
    TYP_AFF 3 3 Autre
    TYP_AFF 1 1 Divers
    COD_LAN 1 1 Français

    On voit que chaque id_code_list correspond à un type de donnée (comme dans un enum en fait) et que l'identifiant (numérique ou String) correspond à la donnée elle-même.

    J'ai pensé implémenter ceci avec un héritage de type (SINGLE_TABLE) de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    @Entity
    @Table(name = "CODE_LIST")
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "ID_CODE_LIST")
    public abstract class CodeListString {
     
        @Id
        @Column(name = "VAL_STRING")
        protected String value;
     
        @Embedded
        protected Label label;
     
        @Embedded
        protected PersistenceSignature signature;
    Enité AffiliateType:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    @Entity
    @DiscriminatorValue("TYP_AFF")
    @Access(AccessType.PROPERTY)
    public class AffiliateType extends CodeListString{
     
        public static final AffiliateType SOCIAL_SECRETARIAT = new AffiliateType("1");
        public static final AffiliateType VARIOUS_SERVICES = new AffiliateType("2");
        public static final AffiliateType OTHERS = new AffiliateType("3");
        public static final AffiliateType SOPA = new AffiliateType("9");
     
        public AffiliateType() {}
     
        private AffiliateType(String value) {
            super(value);
        }
    }
    et mon entité Affilié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Entity
    @Table(name = "AFF")
    public class Affiliate {
        @Id
        @Column(name = "NO_AFF")
        private int id;
     
        @ManyToOne
        @JoinColumn(name = "TYP_AFF")
        private AffiliateType type;
    Mais je vois que la relation prend comme Foreign Key les deux champs de CodeList alors que dans la table aff on en a qu'un...:
    Foreign key (FK7re97tvvbbo2km961gy9b5jw6:aff [typ_aff])) must have same number of columns as the referenced primary key (code_list [val_string,id_code_list])
    Avez-vous une idée de comment faire un mapping correct pour ce type de structure ?

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'imagine que toutes tes tables existent déjà et que tu ne peux pas les changer ?

    Si je comprends bien ta structure de table, il y a :
    • CODE_LIST avec pour ID [ID_CODE_LIST, VAL_STRING]
    • AFFILIATE avec une colonne contenant une valeur contenue dans la colonne VAL_STRING de CODE_LIST


    Si je ne me trompe pas, soit il y a une FOREIGN KEY de AFFILIATE vers CODE_LIST et tu es obligé d'avoir les deux colonnes de la PRIMARY KEY dans la table (ou bien que VAL_STRING soit UNIQUE et donc puisse faire office de clé seule, mais ça ne semble pas probable ici), soit il n'y a pas de FOREIGN KEY matérialisée et la relation est "seulement" conceptuelle (je sais que les FOREIGN KEY n'ont pas toujours été utilisées dans les vieux systèmes, j'en souffre dans mon travail également).

    Du coup j'imagine que tu es dans la seconde situation. Malheureusement, je ne pense pas que JPA permette de faire une relation sans mapper les deux colonnes de la primary key. Cependant, dans ton cas, ne serait-il pas acceptable d'ajouter une colonne à la table AFFILIATE qui contienne TYP_AFF systématiquement de manière à permettra à JPA de mapper cette relation (et éventuellement créer une FOREIGN KEY, si toutefois tu es certain que la contrainte est déjà respectée bien que non matérialisée).

    J'espère avoir répondu tant que faire ce peut à ta question (bien que je ne sache pas si elle est toujours d'actualité). Si tu as des questions/remarques n'hésite pas à me les transmettre.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/01/2018, 15h29
  2. Réponses: 3
    Dernier message: 14/02/2015, 19h17
  3. [Mapping] Mapping d'une table de lien vers plusieurs objets
    Par fhibernate dans le forum Hibernate
    Réponses: 12
    Dernier message: 25/09/2012, 14h47
  4. Réponses: 8
    Dernier message: 16/11/2010, 16h07
  5. [postgresql]creer une table avec plusieurs clés primaire??
    Par perlgirl dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2004, 17h24

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