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.