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 :

Problème d'héritage


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45

    Informations forums :
    Inscription : Mai 2002
    Messages : 45
    Par défaut Problème d'héritage
    Bonjour,
    J'ai un petit problème lorsque je récupère un objet entité via un appel d'ejb.
    Mon objet (Location) m'est bien retourné, mais 2 de ses champs sont toujours nuls.
    Un peu de code, pour y voir plus clair.
    Ma classe Location est une classe abstraite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Entity
    @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
    @SequenceGenerator(name="seq_location", sequenceName="seq_location")
    public abstract class Location {
     
        @Id
        @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_location")
        protected Long locationId;
     
        @OneToOne(mappedBy="location")
        protected ThemeGroup themeGroup;
    ...
    Et 4 classes étendent la classe Location, dont Country :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Entity
    //@SequenceGenerator(name="seq_location", sequenceName="seq_location")
    public class Country extends Location implements Serializable {
     
        @Column(unique=true)
        private String isoCode;
    ...
    Dans un test JUnit, j'appelle une méthode d'un EJB qui ne fait que chercher un objet, un find(Class, Id).
    Je cherche donc à récupérer un objet Location que je viens de créer (et pas de pb, il est bien persisté en base).
    J'appelle donc ma méthode, quand je suis dans l'exécution de la méthode de mon EJB (en débug), je récupère bien l'objet Location et tout ses attributs.
    Mais quand je récupère le résultat côté JUnit, les attributs locationId et themeGroup de Location sont devenus NULL. Et comme par hasard, ce sont les 2 champs que j'hérite de la classe abstraite...

    Qqun y voit-il quelquechose?

    Merci d'avance.

    JM

  2. #2
    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
    Il faudrait utiliser le polymorphisme, c'est fait pour ça...

    Tu utilises une colonne discriminante et en fonction de la valeur du discriminant, tu crées telle ou telle classe.
    Voici un petit aperçu :
    la classe de base
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    @Entity
    @Table(name = "r1_reference_identifiant", uniqueConstraints = {})
    @Inheritance(strategy = InheritanceType.JOINED)
    @DiscriminatorColumn(name="reference.code")
    public class R1ReferenceIdentifiant implements java.io.Serializable
    {
        private static final long serialVersionUID = 1L;
        // Fields
        private Integer uid;
        private Identifiant identifiant;
        private Reference reference;
     
        // Constructors
     
        /** default constructor */
        public R1ReferenceIdentifiant()
        {
        }
     
        /** full constructor */
        public R1ReferenceIdentifiant(Integer uid, Identifiant identifiant, Reference reference)
        {
            this.uid = uid;
            this.identifiant = identifiant;
            this.reference = reference;
        }
     
        // Property accessors
        @Id
        @GeneratedValue()
        @Column(name = "UID", unique = true, nullable = false, insertable = true, updatable = true)
        public Integer getUid()
        {
            return this.uid;
        }
     
        public void setUid(Integer uid)
        {
            this.uid = uid;
        }
     
        @ManyToOne(cascade = {}, fetch = FetchType.LAZY)
        @JoinColumn(name = "IDENTIFIANT_UID", unique = false, nullable = false, insertable = true, updatable = true)
        public Identifiant getIdentifiant()
        {
            return this.identifiant;
        }
     
        public void setIdentifiant(Identifiant identifiant)
        {
            this.identifiant = identifiant;
        }
     
        @ManyToOne(cascade = {}, fetch = FetchType.LAZY)
        @JoinColumn(name = "REFERENCE_UID", unique = false, nullable = false, insertable = true, updatable = true)
        public Reference getReference()
        {
            return this.reference;
        }
     
        public void setReference(Reference reference)
        {
            this.reference = reference;
        }
    }
    La classe "typée"
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    @Entity
    @Table(name = "ago", uniqueConstraints = {})
    @PrimaryKeyJoinColumn(name="R1_REFERENCE_IDENTIFIANT_UID", referencedColumnName="UID" )
    @DiscriminatorValue(value="AGO")
    public class Ago extends R1ReferenceIdentifiant implements java.io.Serializable
    {
        private static final long serialVersionUID = 1L;
        // Fields
        private Integer r1ReferenceIdentifiantUid;
        private Set<AgoFct> agoFcts = new HashSet<AgoFct>(0);
     
        // Constructors
     
        /** default constructor */
        public Ago()
        {
        }
     
        /** minimal constructor */
        public Ago(Integer r1ReferenceIdentifiantUid)
        {
            this.r1ReferenceIdentifiantUid = r1ReferenceIdentifiantUid;
        }
     
        /** full constructor */
        public Ago(Integer r1ReferenceIdentifiantUid, Set<AgoFct> agoFcts)
        {
            this.r1ReferenceIdentifiantUid = r1ReferenceIdentifiantUid;
            this.agoFcts = agoFcts;
        }
     
        // Property accessors
        @Column(name = "R1_REFERENCE_IDENTIFIANT_UID", unique = true, nullable = false, insertable = false, updatable = false)
        public Integer getR1ReferenceIdentifiantUid()
        {
            return this.r1ReferenceIdentifiantUid;
        }
     
        public void setR1ReferenceIdentifiantUid(Integer r1ReferenceIdentifiantUid)
        {
            this.r1ReferenceIdentifiantUid = r1ReferenceIdentifiantUid;
        }
     
        @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy = "ago")
        public Set<AgoFct> getAgoFcts()
        {
            return this.agoFcts;
        }
     
        public void setAgoFcts(Set<AgoFct> agoFcts)
        {
            this.agoFcts = agoFcts;
        }
    }
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45

    Informations forums :
    Inscription : Mai 2002
    Messages : 45
    Par défaut
    Merci.
    Mais... ça ne m'avance pas beaucoup ce que tu me dis.

    Citation Envoyé par OButterlin Voir le message
    Il faudrait utiliser le polymorphisme, c'est fait pour ça...
    C'est ce qu'il me semblait faire...

  4. #4
    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
    Citation Envoyé par chezjm Voir le message
    Citation Envoyé par OButterlin
    Il faudrait utiliser le polymorphisme, c'est fait pour ça...
    C'est ce qu'il me semblait faire...
    Effectivement, j'y suis allé un peu fort... désolé...

    Je pense que dans ton cas, ce serait plutôt @embeddable sur la classe Location (pas abstract) et @embedded dans la classe Country qui correspondrait le mieux (à ce qu'il me semble comprendre du problème , je suppose qu'il n'existe pas une table Location...)

    Pourrais-tu montrer le modèle db ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45

    Informations forums :
    Inscription : Mai 2002
    Messages : 45
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Je pense que dans ton cas, ce serait plutôt @embeddable sur la classe Location (pas abstract) et @embedded dans la classe Country qui correspondrait le mieux (à ce qu'il me semble comprendre du problème , je suppose qu'il n'existe pas une table Location...)
    Oui mais moi je veux faire des références vers des objets Location. Location étant une entité abstraite, étendue par Country, Region ou City.

    Citation Envoyé par OButterlin Voir le message
    Pourrais-tu montrer le modèle db ?
    Dans mon modèle de base, j'ai des tables Country, Region et City, qui ont un idLocation. Il n'y a pas de table Location.

    Tout ça me convient. J'arrive à persister mes objets, le problème intervient juste quand je récupère mes objets, où seuls les champs hérités de Location sont à NULL...

  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
    (juste un test)
    As-tu essayé de retirer "abstract" ?

    A+
    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. [C#] Problème d'héritage, aide svp :(
    Par choas dans le forum Windows Forms
    Réponses: 12
    Dernier message: 06/05/2006, 12h46
  2. problème constructeur + héritage
    Par BOLARD dans le forum C++
    Réponses: 10
    Dernier message: 13/04/2006, 09h11
  3. [AS2] Problème d'héritage
    Par wwave dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 27/01/2006, 10h26
  4. Problème d'héritage ?
    Par Romanops dans le forum WinDev
    Réponses: 2
    Dernier message: 16/11/2005, 18h18
  5. 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

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