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 :

[Hibernate]Problème pour mapping d' un héritage


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Par défaut [Hibernate]Problème pour mapping d' un héritage
    J'ai un petit spucis sur le mapping d'un héritage avec stratégie une table par classe fille.
    Voici un petit schema (mal fait) de l'héritage que je souhaite implémenter
    Personne est une classe abstraite.


    J'ai réalisé le mapping suivant :
    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
    67
    68
     
    <hibernate-mapping >
     
    		<class name="persistance.Personne" abstract="true">
    			<id name="id" type="integer">
     				<column name="id"/>
     				<generator class="assigned" />
     			</id>
    			<property name="nom" type="string"> </property>
    			<property name="prenom" type="string"> </property>
     
                            <many-to-one name="authentification" 
            		column="auth_id" 
    				class="persistance.Authentification"
            		unique="true"
            		not-null="true"
    				fetch="join" />
     
    			<union-subclass name="persistance.User" table="utilisateurs">
     
     				<property name="nom" type="string"> </property>
    				<property name="prenom" type="string"> </property>
    				<property name="societe" type="string"> </property>
     
    				<property name="quotaAut" column="quota_aut" />
    				<property name="quotaCour" column="quota_cour"/>
     
    				<property name="tel" type="string" />
    				<property name="adresse" type="string" />
    				<property name="cp" type="int" />
    				<property name="ville" type="string" />
    				<property name="mailPerso" type="string" />
     
    				<set name="fichiers" inverse="true" lazy="true" cascade="all-delete-orphan">
    					<key column="util_id"></key>
    					<one-to-many class="persistance.Fichier"></one-to-many>
    				</set>
     
    				<set name="mails" inverse="true" lazy="true" cascade="all-delete-orphan">
    					<key column="util_id"></key>
    					<one-to-many class="persistance.Mail"></one-to-many>
    				</set>
     
    				<many-to-one name="authentification" 
            			column="auth_id" 
    					class="persistance.Authentification"
            			unique="true"
            			not-null="true"
    					fetch="join" />
     
    			</union-subclass>
     
    			<union-subclass name="persistance.admin" table="admin">
     
    				<property name="nom" type="string" /> 
    				<property name="prenom" type="string" /> 
    				<many-to-one name="authentification" 
            			column="auth_id" 
    					class="persistance.Authentification"
            			unique="true"
            			not-null="true"
    					fetch="join" />
     
    			</union-subclass>
     
    		</class>
     
    	</hibernate-mapping>
    et j'ai l'erreur suivante en retour :
    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
     
    java.lang.ExceptionInInitializerError
    	at persistance.HibernateUtil.<clinit>(HibernateUtil.java:17)
    	at persistance.HibernateManager.recupererUser(HibernateManager.java:123)
    	at metier.GestionUser.recupererUser(GestionUser.java:163)
    	at controleur.ServletFichier.doPost(ServletFichier.java:190)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
    	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
    	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    	at java.lang.Thread.run(Unknown Source)
    Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: persistance.admin column: nom (should be mapped with insert="false" update="false")
    	at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:575)
    	at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:597)
    	at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:615)
    	at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:405)
    	at org.hibernate.mapping.UnionSubclass.validate(UnionSubclass.java:40)
    	at org.hibernate.cfg.Configuration.validate(Configuration.java:984)
    	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1169)
    	at persistance.HibernateUtil.<clinit>(HibernateUtil.java:13)
    	... 19 more
    Je ne comprend pas pourquoi il rale car c'est pourtant bien explicité dans le manuel :
    Chaque table définit des colonnes pour toutes les propriétés de la classe, incluant les propriétés héritéés.
    cf : Manuel Hibernate
    Images attachées Images attachées  

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Par défaut
    Petit changement, visiblement, il ne faut pas remapper les propriété de la classe mère (c'est super une doc qui dit des conneries ...).

    Maintenant mon soucis est que ma classe personne est abstraite, et ma classe admin n'a aucun attribut supplementaire que la classe Personne, d'où un mapping vide pour admin. Et ca ca ne lui plait pas trop trop à Hibernate visiblement ...

    Quelqu'un voit t'il comment faire fonctionner tout cela ?

    Edit : si cela est possible, ensuite je génère quoi comme requète pour récupérer mes user ou admin, une requète sur Personne.class ? Mais elle est abstraite donc ensuite comment savoir si il s'agit d'un User ou un Admin ? (instanceof ?)

    Ou je demande explicitement a recuperer un User ou un admin ? que je place dans mon code metier dans une variable de type personne Personne ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Par défaut
    aller aller personne n'a jamais mappé un héritage de cette manière ?

  4. #4
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Yop, jvais donc m'y coller à ce problème. Ici, tu utilises donc un héritage avec la stratégie "one table per concrete class". Peux tu renvoyer l'erreur de Hibernate ou bien est-ce celle que j'ai trouvé sur le forum même d'Hibernate datant de ce matin ?!?

    (oui, moi aussi je rencontre des difficultés avec mon mapping actuel )

    Sinon, bah essaie de récupérer ton objet Personne et il faudra l'identifier, en effet par le instanceof pour déterminer sa nature exacte dans les cas où tu veux prendre les deux. Maintenant, si tu te situe dans un cas ou tu demandes uniquement les admins, bah ne récupère que les admin et non les autres

    EDIT : Pour ce qui est de la doc ... elle est explicite, chaque classe (concrete) déclare ses propres attributs ... hibernate doit normalement reconnaitre ceux appartenant à la classe mère. Il me semble cependant qu'il requiert la condition du même nom de colonne, mais bon, c'est à vérifier ca

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    370
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2006
    Messages : 370
    Par défaut
    Oue merci Bizur

    En fait oui l'erreur de ce matin est bien la dernière, il semble ne pas vouloir de ma classe Admin vide.

    En fait ce que tu me proposerait ca serai de laisser mon architecture de l'appli, mais de tricher pour Hibernate en n'explicitant pas la classe personne abstraite et lorsque je veux recuperer un admin je recupère une personne en base et je le cast directement en admin ?

  6. #6
    Membre émérite Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!ELEMENT union-subclass (
     	meta*,
    	subselect?,
    	synchronize*,
    	comment?,
            tuplizer*,
            (property|...|primitive-array)*,
    	union-subclass*,
    	loader?,sql-insert?,sql-update?,sql-delete?,
            resultset*,
    	(query|sql-query)*
    )>
    D'après la DTD, il accepte sans aucun problème les <union-subclass> vides.
    D'apres la trace de ton post (essaie de la glisser en edit de ton messager précédent ), je dirai qu'il ne reconnait pas la classe persistance.admin puisque celle ci doit surement s'appeler persistance.Admin , essaie donc cela pour voir


    Citation Envoyé par K-Kaï
    En fait ce que tu me proposerait ca serai de laisser mon architecture de l'appli, mais de tricher pour Hibernate en n'explicitant pas la classe personne abstraite et lorsque je veux recuperer un admin je recupère une personne en base et je le cast directement en admin ?
    Non, ce que je disais c'est que, lorsque tu as besoin de ne récupérer que les admins ... tu demandes uniquement une requete sur Admin.class, mais si tu as besoin des Personnes (donc Admin et User) et demande un filtre sur Personne.class. Ca ne se fait que dans la requete et ca n'est pas de la "triche" puisque ton objectif n'est de retenir QUE les admins ... donc pourquoi compliquer la requete en recupérant les personnes (il fera un UNION) alors qu'en demandant uniquement les admin, il se contentera d'un simple SELECT sur la table ADMIN

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/09/2011, 10h11
  2. [Hibernate] Problème de mapping
    Par YokoSop dans le forum Hibernate
    Réponses: 3
    Dernier message: 25/07/2006, 09h53
  3. [hibernate]Problème mapping classe association
    Par jsl1 dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/06/2006, 17h27
  4. [Hibernate] Problème dans le fichier mapping
    Par sabour_mounir dans le forum Hibernate
    Réponses: 3
    Dernier message: 15/05/2006, 11h41
  5. [hibernate] problème pour desactiver le lazy loading
    Par agougeon dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/03/2006, 11h20

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