我刚刚设置了一个测试,检查我能够使用Hibernate将条目插入到我的数据库中。让我疯狂的事情是Hibernate并没有真正删除条目,虽然它报告他们已经不在了!休眠不会删除我的对象。为什么?
下面的测试运行成功,但是当我检查我的数据库之后,插入的条目仍然存在!我甚至尝试使用声明(是的,我有-ea作为虚拟机参数)来检查它。有没有人有线索为什么这些条目不被删除?
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=?
,但是当我检查什么已被删除。
你可能是对的,因为我知道我对Hibernate正确使用的知识接近'nil'。当我明天回去工作并回报时,我会研究这是如何工作的。谢谢! – oligofren 2011-03-08 18:18:12
尽管您提供的代码不够完整,但您对事务的原因是正确的。如果使用你的代码,我会得到一个异常,说当session进入session.delete()时会话被关闭。我不太清楚为什么,但我想为每个逻辑操作(可能包含多个事务)打开一个新会话更有意义。 – oligofren 2011-03-09 10:06:35
还没有完成那里... 为了让一切工作,这基本上是我所做的。 在涉及查询数据库/休眠I: 的每个方法中 - 打开一个新的会话。会话会话= HibernateUtil.getSessionFactory()。openSession(); - 开始了一个新的交易 '会议。beginTransaction();' - 提交交易 'session.flush();' 'session.getTransaction()。commit();' – oligofren 2011-03-09 10:10:36