我剛剛設置了一個測試,檢查我能夠使用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