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 :

a different object with the same identifier value was already associated with the ses


Sujet :

Hibernate Java

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut a different object with the same identifier value was already associated with the ses
    Hello,

    Parfois je rencontre cette exception lorsque je sauvegarde une entité

    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
     
    Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [xxx.xxx.xxx.model.TauxOccupation#49]
    	at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:590)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:284)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
    	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
    	at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:218)
    	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
    	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
    	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
    	at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
    	at org.hibernate.engine.Cascade.cascade(Cascade.java:97)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:357)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:329)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:223)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:89)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
    	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
    	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)
    	at org.springframework.orm.hibernate3.HibernateTemplate$16.doInHibernate(HibernateTemplate.java:747)
    	at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
    	... 59 more
    Et voici le code de mon findByCriteria pour mon entité TauxOccupation

    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
     
    public TauxOccupation findByCriteria(TauxOccupation tauxOccupation) {
    		Session session = getSession();
    		session.getSessionFactory().openSession();
    		Criteria criteria = session.createCriteria(TauxOccupation.class);
    		if (tauxOccupation.getLibelleLongFR() != null && tauxOccupation.getLibelleLongFR().length() > 0) {
    			criteria.add(Expression.eq("libelleLongFR", tauxOccupation.getLibelleLongFR()));
    		}
    		List<TauxOccupation> tmp = new ArrayList<TauxOccupation>();
    		tmp = criteria.list();
    		if (tmp.size() > 0) {
    			TauxOccupation result;
    			result = tmp.get(0);
    			session.evict(result);
    			result = (TauxOccupation) session.load(TauxOccupation.class, result.getId());
    			session.lock(result, LockMode.READ);
    			return result;
    		}		
    		session.close();
    		return null;
    	}
    De quoi cela peut il provenir je fais pourtant un evict et lock.

    La seule manière de contourner ce problème est de définir dans le mapping la chose suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	/** The taux occupation of the personne.  */
    	@ManyToOne(fetch = FetchType.EAGER, optional = true)
    	@Cascade((org.hibernate.annotations.CascadeType.EVICT))
    	private TauxOccupation tauxOccupation;
    Quelqu'un aurait une explication ?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Que veux tu faire exactement ?
    Pourquoi ne renvoies tu pas directement tmp.get(0) ?

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    Hello,

    Dans 75% des cas le travail s'arrêterait ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ublic TauxOccupation findByCriteria(TauxOccupation tauxOccupation) {
    		Session session = getSession();
    		session.getSessionFactory().openSession();
    		Criteria criteria = session.createCriteria(TauxOccupation.class);
    		if (tauxOccupation.getLibelleLongFR() != null && tauxOccupation.getLibelleLongFR().length() > 0) {
    			criteria.add(Expression.eq("libelleLongFR", tauxOccupation.getLibelleLongFR()));
    		}
    		List<TauxOccupation> tmp = new ArrayList<TauxOccupation>();
    		tmp = criteria.list();
    		if (tmp.size() > 0) {
    			TauxOccupation result;
    			result = tmp.get(0);
    .......
    Mais dans certaine situation il s'avère que ce n'est pas suffisant car une version de l'objet récupérer existe déjà en session.

    Dans certains également un session.lock(result, LockMode.READ); et également suffisant mais cela ne couvre pas l'ensemble des cas ...

    Je vais testé demain si la solution de ne mettre qu'en annotation EVICT résoudrait tous les cas d'utilisation

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/04/2009, 14h07
  2. different object with the same identifier was already associated with the session
    Par lextaz33 dans le forum Développement Web en Java
    Réponses: 6
    Dernier message: 02/03/2009, 14h36
  3. Réponses: 1
    Dernier message: 12/01/2009, 17h52
  4. Réponses: 1
    Dernier message: 27/10/2008, 17h08
  5. Réponses: 2
    Dernier message: 27/07/2007, 09h21

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