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.  [ 3 posts ] 
Author Message
 Post subject: Probleme de collections (initialisation douteuse)
PostPosted: Fri Jan 12, 2007 6:19 am 
Newbie

Joined: Thu Jan 11, 2007 12:37 pm
Posts: 1
Hibernate version:3.0
Name and version of the database: mySQL v5.0.26


Bonjour,

J'essaye de mapper une BDD en mySQL qui vient d'une base access assez incomprehensible...


Mon modèle objet est le suivant

J'ai un objet article qui possede un Set d'objet Systeme qui possede lui meme un Set d'objet Contrat

(Je precise que pour ce contexte les noms article et produit designent les memes objets)

Ma BDD contient 5 tables :

article
_____________________________________________
No_ARTICLE (varchar(45)) | LIB_ARTICLE (VARCHAR(45)) |


contrat
________________________________________________________________
nom_client (varchar(45)) | libelle_contrat (varchar(45)) | nb_contrat (varchar(45)) |


produit_sys
__________________________________________________
NO_PRODUIT (varchar(45)) | SYS (varchar(45)) | QTE (INTEGER)|



sys_client
_________________________________
sys (varchar(45)) | nom_client (varchar(45)) |



sys_type
_____________________________________
NO_SYS (varchar(45)) | LIB_SYS (varchar(45)) |


J'ai le mapping suivant:
Article.hbm.xml
Code:
<hibernate-mapping>
    <class name="metier.Article" table="article" catalog="testHibernate">
        <id name="numeroArticle" type="string">
            <column name="NO_ARTICLE" />
        </id>
        <property name="libelleArticle" type="string">
           <column name="LIB_ARTICLE"/>
        </property>
        <map name="systemes" table="produit_sys">
           <key column="NO_PRODUIT"/>
           <map-key-many-to-many column="SYS" class="metier.Systeme"/>
           <element type="java.lang.Integer" column="QTE"/>
       </map>
    </class>
</hibernate-mapping>


Systeme.hbm.xml
Code:
<hibernate-mapping>
    <class name="metier.Systeme" table="sys_type" catalog="testHibernate">
        <id name="numeroSysteme" type="string">
            <column name="NO_SYS" />
        </id>
        <property name="libelleSysteme" type="string">
           <column name="LIB_SYS"/>
        </property>
      <set name="produits" table="produit_sys" lazy="true" fetch="select" inverse="true">
            <key>
                <column name="SYS" length="15" not-null="true"/>
            </key>
            <many-to-many class="metier.Article" />
        </set>
        <set name="contrats" table="sys_client" lazy="false">
           <key>
               <column name="sys"/>
            </key>
           <many-to-many  column="nom_client" property-ref="nomClient" class="metier.Contrat" />
       </set>
    </class>
</hibernate-mapping>



Contrat.hbm.xml
Code:
<hibernate-mapping>
    <class name="metier.Contrat" table="contrat" catalog="testHibernate">
        <id name="libelleContrat" type="string">
           <column name="libelle_contrat"/>
        </id>
        <property name="nomClient">
           <column name="nom_client" />
        </property>
        <property name="nombreContrat" type="java.lang.Integer">
           <column name="nb_contrat"/>
        </property>
    </class>
</hibernate-mapping>





Le probleme est le suivant : lorsque je crée 2 articles dans la base, que je les crée coté objet et que j'essaye d'acceder aux informations de chaque contrat de chaque systeme, j'obtiens des résultats etranges.
En fait, pour le premier 'Systeme' mon Set de 'Contrat' est correctement initialisé, chargé et persisté, par la suite, s'il s'avere qu'un autre 'Article' possede le meme 'Systeme', le Set est également correctement chargé. Cependant, pour un autre 'Systeme' il s'avere qu'un seul 'Contrat' apparait coté objet alors que le DEBUG d'hibernate montre que le resultat de la requete contient 3 lignes.


Quote:
17:27:18,155 DEBUG [main] org.hibernate.engine.CollectionLoadContext.getLoadingCollection(CollectionLoadContext.java:112) - reading row
17:27:18,155 DEBUG [main] org.hibernate.type.NullableType.nullSafeGet(NullableType.java:122) - returning 'myClient1' as column: nom2_1_
17:27:18,155 DEBUG [main] org.hibernate.loader.Loader.doQuery(Loader.java:709) - done processing result set (3 rows)
17:27:18,155 DEBUG [main] org.hibernate.jdbc.AbstractBatcher.logCloseResults(AbstractBatcher.java:381) - about to close ResultSet (open ResultSets: 1, globally: 1)
17:27:18,170 DEBUG [main] org.hibernate.jdbc.AbstractBatcher.logClosePreparedStatement(AbstractBatcher.java:366) - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
17:27:18,170 DEBUG [main] org.hibernate.jdbc.AbstractBatcher.closePreparedStatement(AbstractBatcher.java:525) - closing statement
17:27:18,170 DEBUG [main] org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:839) - total objects hydrated: 0
17:28:43,031 DEBUG [main] org.hibernate.engine.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:262) - 1 collections were found in result set for role: metier.Systeme.contrats
17:29:42,078 DEBUG [main] org.hibernate.engine.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:206) - collection fully initialized: [metier.Systeme.contrats#mySys2]
17:30:55,454 DEBUG [main] org.hibernate.engine.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:272) - 1 collections initialized for role: metier.Systeme.contrats
17:31:17,720 DEBUG [main] org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:832) - initializing proxy: [metier.Systeme#mySys2]
17:31:17,720 DEBUG [main] org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:328) - attempting to resolve: [metier.Systeme#mySys2]
17:31:17,720 DEBUG [main] org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:341) - resolved object in session cache: [metier.Systeme#mySys2]
17:31:44,361 DEBUG [main] org.hibernate.loader.Loader.loadCollection(Loader.java:1934) - done loading collection
17:31:44,361 DEBUG [main] org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:61) - collection initialized
17:31:44,361 DEBUG [main] org.hibernate.loader.Loader.loadEntity(Loader.java:1807) - done entity load
taille de la liste des contrats :1 (size of the set of 'Contrat')



Vous pouvez trouver un exemple de l'application avec toutes les librairies requises et les fichiers de mapping dans le jar suivant :
testHibernate.jar

et un script permettant de construire la base exemple :
testHibernate.sql

(creer un utilisateur de la base avec comme nom dss et mdp dss ayant tous les droits sur la base testHibernate)


Ce probleme fait penser a un bug d'hibernate mais il est fort probable que je me trompe quelque part (mais je vois vraiment pas où...).



Merci de votre aide.


Last edited by npuv on Fri Jan 12, 2007 10:18 am, edited 1 time in total.

Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 12, 2007 7:24 am 
Newbie

Joined: Thu Jan 11, 2007 11:49 am
Posts: 3
Je confirme, le problème est reproductible (à build-path Eclipse près) à partir des fichiers fournis.

Le plus bluffant à l'analyse des logs, c'est que le ResultSet retourne apparemment les bonnes données et que les objets "Contrat" sont récupérés comme il faut de la session, mais que la collection initialisée pour le second "Systeme" ne contient que le premier trouvé.

On constate en outre qu'avec un nombre arbitraire de "Systeme", la collection n'est correcte que pour le premier considéré.

_________________
Kernel panic: <EOF> from device: /dev/brain0


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 12, 2007 12:19 pm 
Newbie

Joined: Thu Jan 11, 2007 11:49 am
Posts: 3
Après une analyse un peu plus poussée, il semble que les collections de contrats pour les systèmes autres que le premier système ne contiennent que le dernier contrat du premier système: si on a pour le système S1 les contrats (dans l'ordre) C1, C2, C3, on n'a pour les systèmes S2 et S3 que le système C3 (alors qu'on devrait avoir les 3).

Au débuggage, il semble que dans PersistentSet.readFrom(...), le ResultSet contient les bonnes lignes (avec les 3 contrats), mais que l'initialisation du Set à partir de ces lignes s'obstine à lire uniquement le dernier dans le cas des systèmes autres que le premier.

Ceci me fait un peu penser à un problème de ResultSet non "rembobiné" ou de cache de données...

_________________
Kernel panic: <EOF> from device: /dev/brain0


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 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.