Hello,
Parfois je rencontre cette exception lorsque je sauvegarde une entité
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
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
De quoi cela peut il provenir je fais pourtant un evict et lock.
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; }
La seule manière de contourner ce problème est de définir dans le mapping la chose suivante
Quelqu'un aurait une explication ?
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;
Partager