java - Hibernate 没有删除我的对象。为什么?

标签 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=?

但当我检查时,没有任何内容被删除。

最佳答案

我猜这与事务使用不一致有关(请注意,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();

另请参阅:

关于java - Hibernate 没有删除我的对象。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5235868/

相关文章:

java - 如何将 Hibernate Search (Lucene) 与分页和 ACL 结合起来

android - ActivityTestRule 在 android 测试中被弃用

java - 将大字符串分成小字符串

java - Spring JPA多对多关系无法获取数据

java - Cordova 插件公开 JS 变量 (Android) (CardFlight)

java - 强制执行刷新以获取新的主键 ID 来存储 EmbeddedId

java - 自定义运行通知程序

java - JUnit @Before 和@After 在每次测试之前和之后执行

java - Tomcat7 Spring Maven Mysql 对于类型 avax/el/ExpressionFactory 有不同的 Class 对象;

java - 线程中的异常 "main"java.lang.NumberFormatException : For input string: "147j"