我刚刚设置了一个测试,检查我是否能够使用 Hibernate 将条目插入到我的数据库中。让我发疯的是,Hibernate 实际上并没有删除这些条目,尽管它报告说它们已经消失了!
下面的测试运行成功,但是当我之后检查我的数据库时,插入的条目仍然存在!我什至尝试使用 assert 检查它(是的,我有 -ea 作为 vm 参数)。有人知道为什么条目没有被删除吗?
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();
}
}
控制台充满了
Hibernate: delete from UPTIME_STATISTICS where logDate=? and serviceId=?
但当我检查时,没有任何内容被删除。
最佳答案
我猜这与事务使用不一致有关(请注意,allStatisticItemsInDB()
中的 beginTransaction()
被多次调用,但没有相应的提交)。
尝试以正确的方式管理事务,例如,如下所示:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
for(PersistableStatisticItem item:
session.createQuery("FROM PersistableStatisticItem item").list()) {
session.delete(item);
}
session.flush();
assert session.createQuery("FROM PersistableStatisticItem item").list().size() == 0;
tx.commit();
另请参阅:
关于java - Hibernate 没有删除我的对象。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5235868/