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