-->
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: multiples rappels sur les transactions de la session
PostPosted: Mon Apr 28, 2008 2:05 pm 
Newbie

Joined: Mon Apr 28, 2008 1:27 pm
Posts: 2
Bonjour à tous !!

Config :
Hibernate 3 avec Flex livecycle data service
BDD mySql
Assembleur hibernate

Je débute avec Hibernate et LCDS. J'ai fait pas mal de tests pour arriver à la chose suivante :

Une table "gabarit" et une table "gabaritItem", avec une relation one-to-many.

Après de longues heures de recherche, j'ai fini par arriver à peu près à mon but : Récupérer dans flex tous les gabarits, ainsi que pour chaque gabarit ses "items" associés.

Voici à quoi ressemble mes fichiers de mapping :

Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
      "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.myapp.app.vo">

   <class name="GabaritVO" table="gabarit">
      <id name="id" column="gabaritid" type="java.lang.Integer">
         <generator class="native"/>
      </id>
      <property name="name" column="gabaritname" />
      <property name="desc" column="gabaritdesc" />
      <set name="gabaritItems" inverse="true" cascade="all-delete-orphan">
         <key column="gabaritid" />
         <one-to-many class="GabaritItemVO" />
      </set>
   </class>
   <query name="all.gabarits">From GabaritVO</query>


   <class name="GabaritItemVO" table="gabarititem">
      <id name="id" column="gabarititemid">
         <generator class="native"/>
      </id>
      <many-to-one
         name="gabaritid"
         class="GabaritVO"
         column="gabaritid"
         not-null="true" />
      <property name="day" column="gabarititemday" />
      <property name="hour" column="gabarititemhour" />
      <property name="duration" column="gabarititemduration" />
   </class>
   <query name="all.gabarititems">From GabaritItemVO</query>

</hibernate-mapping>


Maintenant, j'ai différentes questions à propos de cette structure.


1. Configuration du mapping :

tout d'abord, j'ai été obligé de déclarer, dans ma classe GabaritItemVO, la colonne gabaritid sous la forme d'un GabaritVO. Si je laissais un Integer, il me sortait une erreur du type "Hibernate not-null property references a null or transient value". Je ne trouve pas ça très logique de devoir stocker le parent pour chaque enfant... ça multiplie les mêmes données et ça me semble lourd... est-ce qu'hibernate oblige ça ou est-ce que j'ai une autre solution ?? J'ai tenté de mettre java.lang.Integer comme class dans ma relation many-to-one mais ça ne fonctionne pas, il me dit qu'il ne trouve pas la classe. Donc je me pose des questions à ce propos.

2. insert sur les sous-données (gabaritItemVO)

J'ai bien galéré pour réussir à faire un delete (inverse=true, cascade=all-delete-orphan dans GabaritVO et many-to-one dans GabaritItemVO), ainsi qu'un insert (la fameuse colonne de type GabaritVO et la modification de ma classe Java et ActionScript pour refléter ce type de données).
Maintenant, je me retrouve à faire des inserts à partir de flex, et là il me fait un comportement bizarre...

a. je mets l'auto-commit à true sur mon dataService : dès fois (mais pas à chaque fois) il me balance tout d'un coup 10 ou 15 requêtes à la suite pour mettre à jour les données en réincrémentant toutes les transactions de la session (delete suivi d'insert dans la base de données)

b. je mets l'auto-commit à false, j'appelle fill la première fois puis à chaque modification j'appelle commit manuellement, puis une fois commité, j'appelle merge : à ce moment là, ça ne semble pas ramer, mais à chaque fois que je fais un insert, il me delete tous les tuples insérés durant cette session et les réinsert avec un id incrémenté... donc au départ, le premier insert à un id 100, après le second insert, il me remplace le premier à 101 et insert le second à 102, après le 3ème insert, il me remplace le premier à 103, le second à 104 et insert le 3ème à 105, etc... La méthode merge() me modifie bien mon tableau dans flex, mais il m'incrémente tout le groupe de champs modifiés à chaque fois...

c. je mets l'auto-commit à false, j'appelle fill, puis à chaque modification j'appelle commit, puis merge, et enfin je rappelle ma commande contenant le fill. Là, tout fonctionne également, mais ça ne me semble pas correct de devoir rappeler fill à chaque fois... à ce moment là ça ne vaut même pas la peine de travailler avec hibernate, puisque je récupère à chaque fois via le serveur les nouvelles données... j'ai pas l'impression que ça soit dans le concept de données persistantes...

ça ne me semble pas très logique, et je n'arrive pas à trouver pourquoi il réagit de cette manière... j'ai tenté différentes approches sans réel succès...

Si ce genre de problème vous interpèle ou vous dit quelque chose, je suis intéressé à toute suggestion / piste pour pouvoir avancer.


D'avance merci pour votre aide.


Thierry


Top
 Profile  
 
 Post subject:
PostPosted: Sun Jun 22, 2008 5:07 pm 
Proxool Developer
Proxool Developer

Joined: Tue Aug 26, 2003 10:42 am
Posts: 373
Location: Belgium
1/
Pour ma part, le mapping devrait être simplement le suivant:

Code:
<hibernate-mapping package="com.myapp.app.vo">

   <class name="GabaritVO" table="gabarit">
      <id name="id" column="gabaritid" type="java.lang.Integer">
         <generator class="native"/>
      </id>
      <property name="name" column="gabaritname" />
      <property name="desc" column="gabaritdesc" />
      <set name="gabaritItems" cascade="all-delete-orphan">
         <key column="gabaritid" />
         <one-to-many class="GabaritItemVO" />
      </set>
   </class>

   <class name="GabaritItemVO" table="gabarititem">
      <id name="id" column="gabarititemid">
         <generator class="native"/>
      </id>
      <property name="day" column="gabarititemday" />
      <property name="hour" column="gabarititemhour" />
      <property name="duration" column="gabarititemduration" />
   </class>

</hibernate-mapping>


Pas besoin de mapper quoi que ce soit au sujet de la relation vers le parent dans la classe GabaritItemVO (sauf évidemment si tu désires avoir un lien vers le parent - mais à la lecture de ta description cela ne semble pas être le cas).


2/
Je te conseille de ne *pas* jouer avec l'auto-commit mais bien de déléguer la gestion des transactions à ton serveur applicatif. Si pas possible, utilise Spring. Sinon, cfr le chapitre correspondant dans la doc de Hibernate.

Quoi qu'il en soit, le fait que Hibernate supprime le contenu de la collection pour ensuite réinsérer les records provient du fait qu'il est incapable de déterminer si le contenu de la collection a changé ou non. Ceci est illustré/expliqué dans la doc concernant les collections mappées du type Set.


Top
 Profile  
 
 Post subject:
PostPosted: Sun Jun 22, 2008 5:15 pm 
Proxool Developer
Proxool Developer

Joined: Tue Aug 26, 2003 10:42 am
Posts: 373
Location: Belgium
Concernant le point 2: http://www.hibernate.org/403.html


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.