-->
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: Hibernate et HttpSession
PostPosted: Tue Jun 17, 2008 10:49 am 
Newbie

Joined: Tue Jun 17, 2008 10:35 am
Posts: 3
Bonjour a tous,

Je suis nouveau sur Hibernate et je dois terminer une application commencé avec Hibernate 3, java 1.5 et tomcat 6.

Voici mon problème, j'ai l'erreur suivante à la sauvegarde de mon objet :
Code:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: .......


Je me demande si cette erreur ne vient pas du fait que l'objet à sauver est été stocké dans la session HTTP puis modifié avant d'être mis à jour au niveau Hibernate.

La méthode utilisé est elle la bonne ?

Merci d'avance.


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

Joined: Tue Aug 26, 2003 10:42 am
Posts: 373
Location: Belgium
Ton analyse est correcte... partiellement.

La cause principale de ton problème vient bien du fait qu'un objet chargé lors d'une requête (et donc session Hibernate) précédente a été stocké dans la session HTTP.

Il est également tout à fait autorisé de le modifier dans une seconde requête et de le saveOrUpdate à ce moment.

Par contre, il apparait que, pendant la seconde requête, une instance du *même* objet a été chargée par Hibernate et est déjà présente dans la session Hibernate au moment où tu saveOrUpdate la version modifiée que tu avais dans la session Hibernate (tu me suis?). Hibernate se trouve donc à ce moment avec deux instances différentes pour un même objet (au sens de l'identité DB telle que perçue par Hibernate - càd la unique key).

Ce problème arrive généralement lorsqu'on sauvegarde des instances d'objet gérées par Hibernate dans la session HTTP (see "detached object" dans la doc Hibernate).

Tu comprendras que ce type de problème est très sournois - il n'apparait en effet que si le traitement de ta requête HTTP provoque le chargement de la même instance *avant* que tu ne saveOrUpdate la version gardée en session http... Autant dire que même si tu corriges ton problème dans ce cas présent, tu pourrais le voir revenir plus tard, ailleurs, avec d'autres instances...

Pour ma part, il est préférrable de ne *pas* sauvegarder des objets gérés par Hibernate dans la session HTTP et de n'en garder que l'ID pour pouvoir le recharger par la suite.

Si cela n'est pas possible (dans le cas du traitement d'une conversation longue par exemple avec le désir de profiter de l'optimistic locking de Hibernate - via les propriétés "version" ou "timestamp"), alors je te conseille de lire attentivement les différentes sections de la doc de hibernate sur le sujet (chapitres 10.6, 11.3 & 11.4). Tu y trouveras toute l'information dont tu as besoin.

Bonne chance.


Top
 Profile  
 
 Post subject:
PostPosted: Sun Jun 22, 2008 4:16 pm 
Proxool Developer
Proxool Developer

Joined: Tue Aug 26, 2003 10:42 am
Posts: 373
Location: Belgium
PS: dans le second cas, "merge()" might be your friend ;-)


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.