-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: Problème d'héritage sans discriminator-value
PostPosted: Mon Jan 30, 2006 10:57 am 
Newbie

Joined: Fri Mar 12, 2004 11:19 am
Posts: 2
Bonjour,

J'ai un problème qui semble simple mais dont je n'arrive pas à me défaire.
Je vous expose le cas :

Deux applications différentes accèdent à la même base de données et manipulent des objets identiques.

Il nous est donc venu l'idée de mettre en commun un certain nombre de classes et donc de fichier de mapping hibernate dans un .jar séparé.

Les classes qui utilisées par les deux applis sont dans ce jar, chaque
appli peut avoir des mappings complémentaires, chacune d'entre elles
disposant de son hibernate.cfg...

Le problème vient du fait que pour l'une de ces deux applications, je dois
faire évoluer mon mapping hibernate.

Mapping "de base" commun au deux applis :
<hibernate-mapping>
<class name="A" table="TABLE_A">

<id name="code"
type="java.lang.Integer"
column="CODE">
<generator class="assigned" />
</id>

<property
name="libelle"
type="java.lang.String"
column="LIBELLE"
length="100"
/>
</class>
</hibernate-mapping>

Plutôt que de modifier le mapping de ma classe A (mapping partagé
entre mes deux applis), je tente de spécialiser le mapping pour mon application en faisant une sorte d'héritage :

Mapping que je souhaite "spécialisé" pour une des deux applis seulement :
<hibernate-mapping>
<subclass name="B" extends="A">
<set name="associations">
<key column="code"/>
<one-to-many class="C"/>
</set>
</subclass>
</hibernate-mapping>

Je n'ai aucune propriété discriminante (donc c'est un peu rapé pour la sublass), ce n'est qu'un mapping qui se base et qui en enrichie un autre (concernant la même table).

Quelqu'un aurait-il une solution ?

Pierre.


Top
 Profile  
 
 Post subject: Re: Problème d'héritage sans discriminator-value
PostPosted: Mon Jan 30, 2006 12:30 pm 
Newbie

Joined: Sun Jan 15, 2006 4:39 pm
Posts: 6
Bonjour,

Si j'etais a votre place, je mettrais les deux classes dans un hibernate.cfg commun.

Je pense que si l'objet B herite de l'objet A, ils appartiennent d'un seul groupe d'objets (d'un seul domain d'objets). Donc ils doivent etre decrives dans un seul hibernate.cfg, et ses classes corespondantes, doivent etre placees dans un jar commun.

Si votre Application 2 utilise des objet de type A et B et Application 1 utilise seulment des objets de type A - je ne vois pas de problem. Je crois que vous utilisez beaucoup de classes de rt.jar dans chaque application, mais pas toutes les classes de rt.jar, oui?


sasoon


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jan 31, 2006 5:24 am 
Regular
Regular

Joined: Tue May 03, 2005 8:19 am
Posts: 53
Location: Paris
Si tu n'as aucune propriété discriminante pour ton héritage essaye le polymorphism="explicit"

voir http://www.hibernate.org/41.html


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jan 31, 2006 9:35 am 
Newbie

Joined: Fri Mar 12, 2004 11:19 am
Posts: 2
Merci de vos réponses.



La cas du poylmorphism explicite est interessant :
(Je reprends l'exemple du lien fourni par lauvigne)

<class name="DocumentInfo" table="DOCUMENTS">
<id name="key" type="long" column="ID">
<generator class="native"/>
</id>
<property name="name"/>
<property name="created"/>
<property name="updated"/>
<many-to-one name="folder"/>
</class>

<class name="Document" table="DOCUMENTS" polymorphism="explicit">
<id name="key" type="long" column="ID">
<generator class="native"/>
</id>
<property name="name"/>
<property name="created"/>
<property name="updated"/>
<many-to-one name="folder"/>
<property name="text"/>
</class>

Seul souci avec cette approche on ne "profite" pas du mapping
de DocumentInfo pour mapper Document.
En fait on mappe deux fois la même table, sans aucune relation entre
les deux mappings. L'héritage se fait par contre bien côté classe.
C'est très interessant mais je trouve que la logique n'est pas poussée
assez loin. Sans savoir si cela est possible, je trouve qu'il serait
interessant d'avoir, dans le cadre de n applis accédant à la même base de données, un socle commun de mapping sur lequel chaque applis pourrait
se baser et l'enrichir via héritage pour ses besoins propres.

Pour reprendre la dernière phrase de sasson, j'utilise effectivement
bcp de classes de rt.jar sans que cela m'empêche d'en hériter pour les
adapter à mes besoins (affirrmation purement théorique car je ne l'ai
jamais fait dans la pratique... ;-))
J'aimerai juste pouvoir faire la même chose avec les mappings hibernate,
et je ne vois pas pourquoi, par le simple fait de vouloir faire un héritage, il faudrait les mettre dans le même hibernate.cfg.

Dans tous les cas, merci à vous deux pour vos réponses.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Feb 08, 2006 4:38 am 
Newbie

Joined: Thu Jun 02, 2005 4:30 am
Posts: 5
Bonjour Pierre,

As-tu songé à la solution de type <joined-subclass> ?
Il suffit pour cela que ta classe B soit mappée sur une table qui possède une clef etrangère portant sur la clef primaire de la table mappée par A. Dans ce cas, tu devras préciser dans le fichier hibernate.cfg.xml qui concerne B le fichier de mapping A.hbm.xml AVANT le fichier de mapping B.hbm.xml.
Cela fonctionne bien sur aussi si les deux ficheirs sont dans des .JAR différents, il suffit juste qu'ils soient accessibles (classpath).
Référence : Hibernate in Action, version originale, page 105

Hope this helps :)
Ticker


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.