IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Un probable mauvais mapping


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Par défaut Un probable mauvais mapping
    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 :

    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>
    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
    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>
    Ces deux classes sont liées par celle-ci :
    LienAttributActAgregGesCorp :

    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>
    Les problèmes que je rencontre sont de deux types :
    - "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

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 100
    Par défaut
    En ce qui concerne la lazy initialization exception :

    - Le chargement lazy est conseillé dans la plupart des cas pour des questions de performance.

    - Pour qu'un objet soit accédé en dehors de la session, il faut qu'il ai été rafraichi dans la session :
    --> Soit dans la requête hql (par exemple avec un 'left join fetch')
    --> Soit après la requête avec un Hibernate.initialize(mon objet)

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour ta premire erreur, ca se produit quand, soit:

    1) tu mélange 2 sessions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    session1=...
    sesson2=...
     
    x=session1.load(...);
    y1=x.getY();
    y2=session2.load(....);
    x.setY(y2);
    session1.saveOrUpdate(x)
    2) tu 'crée' un objet pour faire un update au lieu de faire un load:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    y1 = new ......;
    y1.setId(idQuiEstDejaDansLaDB)
    y1.setXXXXX(xxxxx);
    session.save(y1);
    Dans tous les cas, il faut éviter de passer un objet d'une session a l'autre, et éviter de définir l'id d'un objet (on a jamais besoin de le faire sois meme)



    Ta deuxième erreur est probablement une autre facette du même problème. (session2 modifie des trucs dans la DB que session1 manipulait aussi)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Par défaut
    Merci pour ces réponses, il y a des choses encourageantes. Pour l'instant je dois continuer sur d'autres choses (questions de priorité) mais j'essairais ça prochainement.

Discussions similaires

  1. [EJB2.1 Entity] [BES] Mapping automatique et clés étrangères
    Par Bobby McGee dans le forum Java EE
    Réponses: 3
    Dernier message: 15/10/2003, 10h33
  2. Réponses: 2
    Dernier message: 11/07/2003, 18h24
  3. Problème avec memory mapping
    Par gemai dans le forum C
    Réponses: 13
    Dernier message: 04/07/2003, 09h50
  4. mauvais code
    Par moumou dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 17/04/2003, 15h56
  5. Editeur de MAP en delphi pour jeux directX
    Par PetitScorpion dans le forum DirectX
    Réponses: 5
    Dernier message: 09/07/2002, 18h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo