Hibernate不会删除我的对象。为什么?

时间:2011-03-08 17:14:46

标签: java hibernate junit4

我刚刚设置了一个测试,检查我是否能够使用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=?

但检查时没有删除任何内容。

3 个答案:

答案 0 :(得分:5)

我猜这与交易的不一致使用有关(请注意,beginTransaction()中的allStatisticItemsInDB()被多次调用而没有相应的提交。

尝试以适当的方式管理交易,例如:

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();

另见:

答案 1 :(得分:1)

我有同样的问题。虽然我根本没有使用交易。我正在使用这样的命名:

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服务器。但我想如果我们使用h2,上面的代码(没有事务)也可以正常工作。 还有一个观察:插入和获取记录事务的使用不是强制性的,但是为了删除记录,我们将不得不使用事务。 (仅在SQL服务器中测试)

答案 2 :(得分:0)

您可以发布数据库架构和HBM或Fluent地图吗?让我回过头来的一件事是我的Fluent地图中有一个ReadOnly()。它从来没有抛出错误,我也在日志中看到了“从blahblah = ...中删除”。

相关问题