[英]Hibernate is not deleting my objects. Why?
我剛剛設置了一個測試,該測試可以檢查是否可以使用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();
也可以看看:
我也有同樣的問題。 盡管我根本沒有使用事務。 我正在這樣使用namedQuery:
Query query = session.getNamedQuery(EmployeeNQ.DELETE_EMPLOYEES);
int rows = query.executeUpdate();
session.close();
它返回2行,但是數據庫仍然具有所有記錄。 然后,我用以下代碼包裝上面的代碼:
Transaction transaction = session.beginTransaction();
Query query = session.getNamedQuery(EmployeeNQ.DELETE_EMPLOYEES);
int rows = query.executeUpdate();
transaction.commit();
session.close();
然后它開始正常工作。 我正在使用SQL Server。 但是我認為,如果我們使用h2,則上述代碼(無事務處理)也可以正常工作。 另一點觀察:插入和獲取記錄對事務的使用不是強制性的,但是對於記錄的刪除,我們將不得不使用事務。 (僅在SQL Server中測試)
您可以發布數據庫架構和HBM或Fluent映射嗎? 讓我回想起一件事的是我的Fluent地圖中有一個ReadOnly()。 它從未拋出錯誤,我也看到了日志中的“從blahblah = ...處刪除”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.