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:
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:
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:
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 ?