Bonjour,

Dans une application utilisant JPA (hibernate) pour persister nos données, nous avons mis en place un DAO générique avec, entre autre, une méthode "save" dont le but est de sauver un objet, qu'il soit managé ou non par hibernate.

L'implémentation est la suivante :
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
 
public class AbstractGenericDao<T extends Identifiable> {
    ...
    @PersistenceContext(unitName="AppPeristanceUnit")
    protected EntityManager em = null;
    ...
    @Transactional(readOnly = false)
    public T save(T entity) {
  	if (entity.getId() == null) {
		em.persist(entity);
		em.flush();
		return entity;
	} else {
		T newEntity = em.merge(entity);
		em.flush();
		return newEntity;
	}
}
Jusqu'à présent il a toujours bien fonctionné.
Mais récemment, dans une application qui importe des données j'ai eu des problèmes de modification non sauvées, et ce malgré le flush.
La table source de l'import comprend un champ qu'on flag pour savoir si l'enregistrement a été importé.
Les enregistrements étaient importés par paquet de 50 et en changeant ce nombre à 1, j'ai constaté qu'après un certain temps, l'importer se mettait à importer en boucle le même enregistrement car son flag n'était pas sauvé.
Dans le log de l'application je ne vois plus la requête d'update (qui était présente avant qu'il se mette à boucler), j'en conclus donc que ma méthode save n'a pas bien fait son boulot ...
Mais pourquoi ... ?