Bonjour,
je travaille actuellement sur une application utilisant Struts,Spring et Hibernate avec une base de données Sybase.
Je rencontre de réguliers problèmes à l'utilisation de trois classes dont voici les mappings.
AttributActiviteCorp :
AgregatGestionCorp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 <hibernate-mapping package="model.corporate" default-access="field" auto-import=" true" default-lazy="false"> <class name="AttributActiviteCorp" table="FE_ATTACTCOR" lazy="false"> <composite-id> <key-property name="codeAttributActiviteCorp" column="D_CATTACT" /> <key-property name="niveau" column="D_NNIVEAU" /> </composite-id> <version name="version" column="D_NVERSION" unsaved-value="negative" /> <property name="debutActivite" column="D_DDEBACT" /> <property name="finActivite" column="D_DFINACT" /> <set name="plageValiditeList" cascade="all,delete-orphan" inverse="true" lazy="false"> <key> <column name="C_CATTACT"/> <column name="C_NNIVEAU"/> </key> <one-to-many class="PlageValiditeAttributActiviteCorp" /> </set> <set name="lienList" cascade="all,delete-orphan" inverse="true" lazy="false"> <key> <column name="C_CATTACT"/> <column name="C_NNIVATT"/> </key> <one-to-many class="LienAttributActAgregGesCorp"/> </set> <property name="codeUtilisateur" column="C_CUTIMAJ" /> <property name="codeMaj" column="D_CCODMAJ" /> <property name="etatSyclade" column="D_CETASYC" /> <property name="derniereMaJ" column="D_DDERMAJ" type="timestamp" /> </class> </hibernate-mapping>
Ces deux classes sont liées par celle-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 <hibernate-mapping package="model.corporate" default-access="field"> <class name="AgregatGestionCorp" table="FE_AGREGGESCOR"> <composite-id> <key-property name="codeAgregatGestionCorp" column="D_CAGREG"></key-property> <key-property name="niveau" column="D_NNIVEAU"></key-property> </composite-id> <version name="version" column="D_NVERSION" unsaved-value="negative" /> <property name="debutActivite" column="D_DDEBACT" /> <property name="finActivite" column="D_DFINACT" /> <set name="plageValiditeList" cascade="all,delete-orphan" inverse="true" lazy="false"> <key> <column name="C_CAGREG" /> <column name="C_NNIVEAU" /> </key> <one-to-many class="PlageValiditeAgregatGestionCorp" /> </set> <set name="lienAttrActList" cascade="all,delete-orphan" inverse="true" lazy="false"> <key> <column name="C_CAGREG"/> <column name="C_NNIVAGR"/> </key> <one-to-many class="LienAttributActAgregGesCorp"/> </set> <property name="codeUtilisateur" column="C_CUTIMAJ" /> <property name="codeMaj" column="D_CCODMAJ" /> <property name="etatSyclade" column="D_CETASYC" /> <property name="derniereMaJ" column="D_DDERMAJ" type="timestamp" /> </class> </hibernate-mapping>
LienAttributActAgregGesCorp :
Les problèmes que je rencontre sont de deux types :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 <hibernate-mapping package="model.corporate" default-access="field"> <class name="LienAttributActAgregGesCorp" table="FR_ATTAGRCOR"> <composite-id> <key-many-to-one name="attributActiviteCorp" class="AttributActiviteCorp" lazy="false"> <column name="C_CATTACT" /> <column name="C_NNIVATT" /> </key-many-to-one> <key-many-to-one name="agregatGestionCorp" class="AgregatGestionCorp" lazy="false"> <column name="C_CAGREG" /> <column name="C_NNIVAGR" /> </key-many-to-one> <!-- LBIL : le mapping des PV est fait avec objetAvecPlagesActivite qui est similaire en terme de structure--> <key-property name="debutActivite" column="D_DDEBVAL" /> </composite-id> <version name="version" column="D_NVERSION" unsaved-value="negative" /> <property name="finActivite" column="D_DFINVAL" /> <property name="codeUtilisateur" column="C_CUTIMAJ" /> <property name="codeMaj" column="D_CCODMAJ" /> <property name="etatSyclade" column="D_CETASYC" /> <property name="derniereMaJ" column="D_DDERMAJ" type="timestamp" /> </class> </hibernate-mapping>
- "a different object with the same identifier value was already associated with the session"
ou
- "org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)"
Actuellement, je suis confronté au deuxième problème. J'utilise une procédure stockée qui va agir sur les agrégats et les liens attributs-agrégats. Celle-ci s'exécute sans souci mais au sortir de la méthode (lorsque que je remonte dans la couche Action) l'exception est levée et la transaction n'aboutit pas. La raison est (si j'ai bien compris) que les liens chargés lors du chargement de l'agrégat ont été modifiés dans la proc stock et ne sont plus identiques entre la base et la session hibernate.
J'ai essayé de passé par un chargement lazy des liens dans le mapping des agrégats mais je rencontre l'erreur suivantes lorsque j'ai besoin d'y accéder :
"failed to lazily initialize a collection of role: model.corporate.AgregatGestionCorp.lienAttrActList - no session or session was closed
"
J'avoue que je suis perdu et que je ne sais comment m'y prendre ... j'ai beau parcourir la doc hibernate je ne trouve pas comment adapter mon cas (ou je ne comprend pas).
Si quelqu'un peut me guider pour trouver une solution ce serait très aimable
Note : je ne suis pas responsable de la base et ne peux y apporter aucune modification
Partager