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 ?