Je viens de mettre en place un test qui vérifie que je suis capable d'insérer des entrées dans ma base de données en utilisant Hibernate. Ce qui me rend fou, c'est qu'Hibernate ne supprime pas les entrées, bien qu'il rapporte qu'elles sont parties!Hibernate ne supprime pas mes objets. Pourquoi?
Le test ci-dessous s'exécute avec succès, mais quand je vérifie ma base de données par la suite, les entrées qui ont été insérées sont toujours là! J'essaie même de le vérifier en utilisant assert (oui j'ai le paramètre -m comme vm). Quelqu'un at-il une idée pourquoi les entrées ne sont pas supprimées?
public class HibernateExportStatisticDaoIntegrationTest {
HibernateExportStatisticDao dao;
Transaction transaction;
@Before
public void setUp(){
assert numberOfStatisticRowsInDB() == 0;
dao = new HibernateExportStatisticDao(HibernateUtil.getSessionFactory());
}
@After
public void deleteAllEntries(){
assert numberOfStatisticRowsInDB() != 0;
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
for(PersistableStatisticItem item:allStatisticItemsInDB()) {
session.delete(item);
}
session.flush();
assert numberOfStatisticRowsInDB() == 0;
}
@Test public void exportAllSavesEntriesToDatabase(){
int expectedNumberOfStatistics = 20;
dao.exportAll(StatisticItemFactory.createTestStatistics(expectedNumberOfStatistics));
assertEquals(expectedNumberOfStatistics, numberOfStatisticRowsInDB());
}
private int numberOfStatisticRowsInDB() {
return allStatisticItemsInDB().size();
}
@SuppressWarnings("unchecked")
private List<PersistableStatisticItem> allStatisticItemsInDB(){
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
transaction = session.beginTransaction();
Query q = session.createQuery("FROM PersistableStatisticItem item");
return q.list();
}
}
La console est rempli de
Hibernate: delete from UPTIME_STATISTICS where logDate=? and serviceId=?
mais rien n'a été supprimé quand je vérifierai.
Vous avez probablement raison, sachant que ma connaissance de l'utilisation correcte d'Hibernate est proche de 'nil'. J'examinerai comment cela fonctionne quand je retournerai au travail demain et rendrai compte. Merci! – oligofren
Vous aviez raison au sujet des transactions étant la cause, bien que votre code fourni n'était pas assez. Si vous utilisez votre code, j'obtiendrai une exception disant que la session a été fermée quand je suis arrivé à session.delete(). Je ne suis pas tout à fait sûr pourquoi, mais je suppose qu'il est plus logique d'ouvrir une nouvelle session pour chaque opération logique (éventuellement composée de plusieurs transactions). – oligofren
N'a pas tout à fait fini là ... Pour que tout fonctionne, c'est essentiellement ce que j'ai fait. Dans chaque méthode qui impliquait des requêtes sur la base de données/Hibernate I: - ouvrait une nouvelle session. Session session = HibernateUtil.getSessionFactory(). OpenSession(); - a démarré une nouvelle transaction 'session.beginTransaction(); ' - a validé la transaction ' session.flush(); ' ' session.getTransaction(). commit(); ' – oligofren