簡體   English   中英

Hibernate不會刪除我的對象。 為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM