Bonjour,
Le code suivant révèle une exception lors de la méthode « em.refresh(p) » : 1: EntityManager em = emf.createEntityManager(); 2: em.getTransaction().begin(); 3: 4: Product p = new Product("J&D", 35.0,"Whisky"); 5: em.persist(p); 6 : 7: em.refresh(p); 8: em.getTransaction().commit(); 9: em.close();
Un debug montre qu’en ligne 6, Hibernate n’a pas (encore) envoyé le statement INSERT à la DB. Il fait comme prévu : il l’enverra lorsqu’il sera obligé.
A la ligne 7, l’exception suivante se déclenche : L’exception est la suivante : Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.HibernateException: this instance does not yet exist as a row in the database
Si on insère à la ligne 6 une instruction qui oblige Hibernate à faire un flush, l’INSERT est envoyé avant la ligne 7 et le refresh s’exécute sans problème. On peut par exemple, insérer un select :
6 : em.createQuery("select p from Product p").getResultList();
Ou même directement un flush explicite. 6 : em.flush();
Cela fonctionne dans les deux cas (l’INSERT est envoyé avant la ligne 7 et aucune exception ne se produit). QUESTION : La méthode « refresh » ne devrait-elle pas forcer l’envoi de l’INSERT par Hibernate, tout comme le fait un SELECT ou un flush ? (autrement dit, n’avons-nous pas ici un bug ?)
Merci pour vos avis.
Pierre
|