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

Hibernate Java Discussion :

Héritage avec une table par classe - chargement


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 15
    Par défaut Héritage avec une table par classe - chargement
    Bonjour,

    J'ai un souci pour charger une classe d'héritage; j'ai une classe mère avec les propriétés communes des classes filles et n classes filles; j'ai autant de tables (une pour les colonnes communes et une table par classe fille), pour être plus clair je vais mettre des morceaux de code :

    Classe mère :

    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.JOINED)
    @DiscriminatorColumn(name="Type_Metadonnee", discriminatorType=DiscriminatorType.INTEGER)
    @Table(name = "metadonnee")
    public abstract class Metadonnee implements java.io.Serializable {
     
    	private MetadonneeId id;
    	private ParamAffichage paramAffichage;
    	private String nom;
    ....
    }
    Une classe fille :
    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
     
    @Entity
    @Table(name = "meta_nom")
    @DiscriminatorValue("0")
    @PrimaryKeyJoinColumns({
            @PrimaryKeyJoinColumn(name="Id_Metadonnee", 
                referencedColumnName="Id_Metadonnee"),
            @PrimaryKeyJoinColumn(name="Version",
                referencedColumnName="Version")
        })
    public class MetaNom extends Metadonnee implements java.io.Serializable {
     
    	private String valeur;
    ...
    }
    Une autre classe fille
    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 = "meta_texte")
    @DiscriminatorValue("1")
    @PrimaryKeyJoinColumns({
            @PrimaryKeyJoinColumn(name="Id_Metadonnee", 
                referencedColumnName="Id_Metadonnee"),
            @PrimaryKeyJoinColumn(name="Version",
                referencedColumnName="Version")
        })
    public class MetaTexte extends Metadonnee implements java.io.Serializable {
     
    	private String texte;
    	private String titre;
    ...
    }
    Dans mon cas j'essaie de charger un objet stocké dans la table "meta_texte"
    Si j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MetadonneeId id = new MetadonneeId(3,1);
    Metadonnee m = (Metadonnee) session.load(Metadonnee.class, id);
    System.out.println(m instanceof MetaTexte);
    Le résultat est false !!

    Si le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MetadonneeId id = new MetadonneeId(3,1);
    MetaTexte m = (MetaTexte) session.load(MetaTexte.class, id);
    System.out.println(m instanceof MetaTexte);
    L'objet est bien chargé et contient bien les valeurs de la classe mère et est de type "MetaTexte".

    J'ai un autre objet qui contient un objet de la classe "Metadonnee" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @Entity
    @Table(name = "objet_metadonnee")
    public class ObjetMetadonnee implements java.io.Serializable {
     
    	private ObjetMetadonneeId id;
    	private Metadonnee metadonnee;
    ...
    }
    Pourquoi au chargement des objets, hibernate ne me caste-t-il pas automatiquement les objets de type "Metadonnee" dans les classes filles (d'autant plus que la classe "Metadonnee" est abstraite dans mon cas)??!!

    Merci pour votre aide, j'espère que c'est assez clair.

  2. #2
    Membre expérimenté Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    En fait je crois que le problème vient de l'utilisation des proxies avec Hibernate (via CGLIB par exemple). Le lien suivant montre une alternative au instanceof avec le pattern "Visitor" : http://www.hibernate.org/280.html

  3. #3
    Membre averti
    Inscrit en
    Août 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 15
    Par défaut
    J'ai trouvé la solution à l'adresse suivante :
    http://forum.hibernate.org/viewtopic...fbdd6c906ba734

    Il suffit d'ajouter le code suivant dans une classe (HibernateUtil par exemple) ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static <T> T deproxy(Object maybeProxy, Class<T> baseClass) throws ClassCastException {
    	   if (maybeProxy instanceof HibernateProxy)
    	      return baseClass.cast(((HibernateProxy) maybeProxy).getHibernateLazyInitializer().getImplementation());
    	   else
    	      return baseClass.cast(maybeProxy);
    }
    Et ensuite pour caster l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MetadonneeId id = new MetadonneeId(3,1);
    Metadonnee m = (Metadonnee) session.load(Metadonnee.class, id);	
    m = HibernateUtil.deproxy(m, Metadonnee.class);
    System.out.println(m instanceof MetaTexte);
    --> il affiche bien "true"

    En fait c'était simple, il suffisait de trouver l'info

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/04/2011, 16h30
  2. problèmes avec la stratégie : une table par classe fille
    Par M.a.n.u. dans le forum Hibernate
    Réponses: 4
    Dernier message: 04/02/2009, 11h01
  3. [template]Héritage d'une Template par une Classe
    Par koni33 dans le forum Langage
    Réponses: 0
    Dernier message: 11/05/2008, 14h12
  4. Problème d'héritage avec une classe abstraite
    Par Ph.denis dans le forum C++
    Réponses: 7
    Dernier message: 22/03/2008, 10h37
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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