Bonjour,
Cela fait plusieurs mois que je développe une webapp utilisant hibernate et je me trouve face à un problème que je n'arrive pas à expliquer: Lorsque j'ajoute une entité, celle-ci n'apparait pas dans la liste des entités que je récupère après l'avoir ajouté (en utilisant une session différente pour la création / listing). Si je re-éxecute plusieurs fois la requête, elle fini par apparaitre dans la liste, parfois disparait. C'est de même pour la modification d'une colonne: si je change la propriété "nom" (un String) d'une entité (ou bien une relation 1->n), parfois le vieux nom apparait, parfois le nouveaux. Si je redémarre le serveur, tout rentre dans l'ordre (j'utilise spring-mvc avec des controlleurs rest).
J'ai bien vérifier que le cache lvl 2 soit désactivé.
Si je recréé une nouvelle SessionFactory à chaque ouverture de session, cela fonctionne (mais bien sur ce n'est absolument pas le but - c'était juste pour tester).
Voici mon fichier de config hibernate
Code:
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">xxxxx</property>
<property name="connection.password">xxxxx</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.use_query_cache">false</property>
<!-- Disable/Enable the second-level cache -->
<property name="hibernate.use_second_level_cache">false</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<!-- Echo all executed SQL to stdout -->
<property name="hibernate.show_sql">true</property>
Et voici le simple test que j'effectue pour me rendre compte que cela ne fonctionne pas:
Code:
// créé les composants de l'option et vérifie qu'elles existent après la création
TypeEntite1 entite1 = new TypeEntite1(0L,"entite1",ecole, annee);
Session session = HibernateUtil.getInstance().getSessionFactory().openSession();
session.beginTransaction();
session.save(entite1);
session.getTransaction().commit();
session.close();
checkOptionComposantExist("entite1", TypeEntite1.class); // la première entité ajouté est toujours retrouvée dans la liste
TypeEntite2 entite2 = new TypeEntite2(0L,"entite2",ecole, annee);
session = HibernateUtil.getInstance().getSessionFactory().openSession();
session.beginTransaction();
session.save(entite2);
session.getTransaction().commit();
session.close();
checkOptionComposantExist("entite2", TypeEntite2.class); // toutes les autres entité ne sont jamais affichée dans la liste
Voici ma méthode qui check si l'entité est bien retrouvée après ajout:
Code:
private void checkOptionComposantExist(String nomAttendu,Class<? extends OptionAbstract> type){
List<OptionAbstract> optionsComposants = genericDAO.list(type);
if(optionsComposants.size() == 0)
fail("Aucun éléments d'options trouvé pour le type " + type.getSimpleName());
for(OptionAbstract optionComposant:optionsComposants){
if(optionComposant.getNom().equals(nomAttendu))
return;
}
fail("L'élément de l'options de type " + type.getSimpleName() + " avec comme nom " + nomAttendu + " n'a pas été trouvé");
}
Et voici la méthode qui récupère une liste d'un certain type d'entité:
Code:
public List list(Class<?> typeParameterClass) {
Session session = sessionFactory.openSession();
List records = session.createCriteria(typeParameterClass).list();
session.disconnect();
return records;
}