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 :

Pb de mapping d'un héritage "table par classe concrète"


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut Pb de mapping d'un héritage "table par classe concrète"
    Bonjour,

    J'utilise hibernate depuis peu, et j'ai encore du mal sur certains points.

    J'aimerai juste mapper 3 tables de ma base de données (Contact, Apprenti, et formateur) qui héritent d'une classe abstraite (Personne) qui ne correspond pas à une table de ma BDD. La classe Personne a une Foreign Key vers une classe Entreprise.
    En gros, c'est le sujet bateau des employés qui héritent de Personne.
    La stratégie de mapping est bien "Une table par classe concrète". Le manuel hibernate ne détaille pas bien cette partie à mon gout :s

    Mapping de la classe Personne :
    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
     
    <hibernate-mapping  default-cascade="none" default-access="property" default-lazy="true" auto-import="true">
        <!-- Mapping de la super classe personne -->
        <class name="com.formation.beans.Personne" abstract="true">
            <id name="id" column="idPers">
                <generator class="native"/>
            </id>  
            <property name="nom"/> 
            <property name="prenom"/>
            <property name="email"/>
            <many-to-one name="ent" class="Entreprise" column="numEnt"/>
     
            <!-- Mapping de la classe Contact -->
            <union-subclass name="Contact" table="t_contact">
                <property name="tel"/>
                <property name="isSource"/>
            </union-subclass>
     
            <!-- Mapping de la classe Apprenti -->
            <union-subclass name="Apprenti" table="t_apprenti">
                <many-to-one name="typeApp"/>            
                <property name="comment"/>
            </union-subclass>   
     
            <!-- Mapping de la classe Formateur -->
            <union-subclass name="Formateur" table="t_formateur">
                <property name="tel"/>
                <property name="firstFormation"/>
                <property name="isManager"/>
            </union-subclass>     
        </class>
    </hibernate-mapping>
    Je souhaite pour l'instant simplement récupérer mes Contacts. Je n'ai pas de mapping spécifique pour cette classe en dehors de la classe Personne.

    Dans ma classe ContactDAO, j'appelle la classe Contact. Et évidemment, il me dit qu'il n'existe pas de mapping pour cette classe.

    J'ai dû oublier une étape. Est-ce que qqun pourrait m'éclairer là dessus ? Je ne trouve pas d'exemples complets pour ce type de mapping.

    Merci d'avance.

  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
    Okazou, n'y aurait-il pas un problème concernant l'attribut name dans tes <union-subclass .../> ?
    Vu le nom de package pour la classe Personne, ne faudrait-il pas remplacer les noms suivants :
    • "Contact" par "com.formation.beans.Contact"
    • "Apprenti" par "com.formation.beans.Apprenti"
    • "Formateur" par "com.formation.beans.Formateur"

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut
    Oula oui merci.
    Ca va déjà un peu mieux. Il a l'air de voir le fichier. Par contre j'ai une nouvelle erreur :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    10:18:21,932 INFO  [STDOUT] 10:18:21,932  INFO Configuration:1409 - Configuration resource: /hibernate.cfg.xml
    10:18:21,993 INFO  [STDOUT] 10:18:21,993  INFO Configuration:559 - Reading mappings from resource : com/formation/beans/hibernate/Entreprise.hbm.xml
    10:18:22,484 INFO  [STDOUT] 10:18:22,484  INFO HbmBinder:300 - Mapping class: com.formation.beans.Entreprise -> t_entreprise
    10:18:22,530 INFO  [STDOUT] 10:18:22,514  INFO Configuration:559 - Reading mappings from resource : com/formation/beans/hibernate/Personne.hbm.xml
    10:18:22,897 INFO  [STDOUT] 10:18:22,530 ERROR XMLHelper:61 - Error parsing XML: XML InputStream(11) Document is invalid: no grammar found.
    10:18:22,897 INFO  [STDOUT] 10:18:22,897 ERROR XMLHelper:61 - Error parsing XML: XML InputStream(11) Document root element "hibernate-mapping", must match DOCTYPE root "null".
    Je n'ai effectivement pas mis de Doctype en haut de mon fichier Personne.hbm.xml. Mais il n'y en a pas non plus en haut de Entreprise.hbm.xml et celle-ci marche parfaitement.

    Si je rajoute le Doctype de mon fichier hibernate.cfg.xml en haut de Personne.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <!DOCTYPE hibernate-configuration PUBLIC
    		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"	
    	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    Il me met une erreur du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Element type "class" must be declared.
    pour tous les éléments du XML :s

    J'ai décidément du mal.
    Merci bcp déjà pour ta réponse.

    EDIT:
    Bon je sais pas à quoi mon pc joue^^
    Hibernate me parse finalement les fichiers.
    Mais j'ai maintenant des bugs de mapping (des vrais^^)

  4. #4
    Membre chevronné Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Par défaut
    Je ne pense pas que ce soit le problème, mais il est tjs mieux de rajouter tout en hayut de tes fichiers xml (avant le doctype) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="UTF-8"?>
    De meme, remplace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <many-to-one name="ent" class="Entreprise" column="numEnt"/>
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <many-to-one name="ent" class="Ecom.formation.beans.Entreprise" column="numEnt"/>

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut
    Oui, en effet ca je l'ai mis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="ISO-8859-1"?>
    Il vaut mieux ISO ou UTF ?

    Alors voici l'erreur de mapping :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Erreur lors de la recherche: org.hibernate.MappingException: An association from the table t_apprenti refers to an unmapped class: java.lang.Integer
    Ca provient de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            <!-- Mapping de la classe Apprenti -->
            <union-subclass name="com.formation.beans.Apprenti" table="t_apprenti">
                <many-to-one name="typeApp"/>            
                <property name="comment"/>
            </union-subclass>
    Mon typeApp est une foreign Key d'une table de la base, mais n'est pas implémenté dans mon diagramme de classe. Il s'agit simplement d'une table comportant une liste de type. Des constantes qui ne seront pas directement modifiées depuis l'appli (enfin, pour l'instant).
    Donc pas de mapping spécifique, et il aime po

    Est-ce que toutes les tables de la base doivent correspondre à une association Classe-Mapping ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut
    Bon, bah j'ai fait des classes pour mes tables de constantes. Je ne sais pas si c'est ce qu'il faut faire. Mais ca passe mieux.

    En revanche, je pense que je n'ai pas bien compris le fonctionnement de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <many-to-one name="ent" class="com.formation.beans.Entreprise" column="numEnt"/>
    J'aimerai ici que Hibernate me rapatrie dans la classe Personne l'objet Entreprise correspondant.
    Dans mes tables, Contact (qui hérite de Personne dans mes classes) dispose de l'identifiant de l'entreprise qui lui correspond (numEnt).
    Et la table Entreprise dispose de son identifiant indépendant (idEnt).

    Lorsque je lance la recherche d'un contact, ou d'une entreprise, j'ai maintenant cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    org.hibernate.MappingException: 
    Cannot use identity column key generation with mapping for: com.formation.beans.Personne
    Merci à JoloKossovar et mOuLi pour vos précédentes réponses.

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

Discussions similaires

  1. [Mapping] Mapping héritage 1 table par classe concrète
    Par hpnet dans le forum Hibernate
    Réponses: 1
    Dernier message: 04/02/2014, 10h45
  2. Réponses: 1
    Dernier message: 17/04/2011, 16h30
  3. 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
  4. Héritage avec une table par classe - chargement
    Par seb35 dans le forum Hibernate
    Réponses: 2
    Dernier message: 04/11/2008, 17h38
  5. supprimer une table qui a des quotes dans son nom
    Par kleenex dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 16h03

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