当前位置: 首页 > 面试题库 >

使DbUnit与Hibernate事务一起使用

江鹏
2023-03-14
问题内容

我在尝试将Hibernate事务中所做的更改推送到数据库以使DbUnit在我的测试用例中正常工作时遇到问题。似乎DbUnit没有看到Hibernate所做的更改,因为它们尚未在事务结束时提交。

这是我过度简化的测试用例,用于演示我的问题:-

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
        "classpath:applicationContext-test.xml"
})
@TransactionConfiguration(transactionManager = "transactionManager")
@Transactional
public class SomeTest {
    @Autowired
    protected DataSource dataSource;

    @Autowired
    private SessionFactory sessionFactory;

    @Test
    public void testThis() throws Exception {
        Session session = sessionFactory.getCurrentSession();

        assertEquals("initial overlayType count", 4, session.createQuery("from OverlayType").list().size());

        //-----------
        // Imagine this block is an API call, ex: someService.save("AAA");
        // But for the sake of simplicity, I do it this way
        OverlayType overlayType = new OverlayType();
        overlayType.setName("AAA");
        session.save(overlayType);
        //-----------

        // flush has no effect here
        session.flush();

        assertEquals("new overlayType count", 5, session.createQuery("from OverlayType").list().size());

        // pull the data from database using dbunit
        IDatabaseConnection connection = new DatabaseConnection(dataSource.getConnection());
        connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new MySqlDataTypeFactory());
        QueryDataSet partialDataSet = new QueryDataSet(connection);
        partialDataSet.addTable("resultSet", "select * from overlayType");
        ITable actualTable = partialDataSet.getTable("resultSet");

        // FAIL: Actual row count is 4 instead of 5
        assertEquals("dbunit's overlayType count", 5, actualTable.getRowCount());

        DataSourceUtils.releaseConnection(connection.getConnection(), dataSource);
    }
}

我使用DbUnit的整个想法是:

  • someService.save(...)将数据保存到多个表的调用。
  • 使用DbUnit从XML获取期望的表。
  • 使用DbUnit从数据库获取实际表。
  • Assertion.assertEquals(expectedTable, actualTable);

但是,在这一点上,我无法让DbUnit看到Hibernate在事务中所做的更改。

我应该如何更改以使DbUnit与Hibernate事务正常工作?

谢谢。


问题答案:

我从未使用过DbUnit,但似乎TransactionAwareDataSourceProxy可以解决问题。基本上,您需要使用此代理包装原始数据源,并改用它,以便此代码:

new DatabaseConnection(dataSource.getConnection())

实际上通过代理,并使用与Hibernate相同的事务和连接。

我找到了说明
事务的数据源(在spring使用dbunit和hibernate)
博客文章。

另一种方法是完全跳过事务测试,而手动清除数据库。看看我的交易测试是否有害。



 类似资料:
  • 问题内容: 我在理解Hibernate如何处理泛型时遇到一些麻烦,并且想知道实现我的目标的最佳方法。 给定一个简单的通用实体: 在进行hibernate初始化时,出现异常: 我几乎可以肯定,这是因为我没有给hibernate一些可能的限制条件。我知道你可以指定的东西,如上面的注释,但你失去使用泛型的灵活性。我可以使用注解限制可接受的泛型的范围吗?例如:如果我想要class ,该类从抽象类继承而来,

  • 我试图使用Maven将Hibernate添加为我的OSGi包的依赖项。在我的POM文件中,我有: 但是,当我运行时,我得到了一个错误: 组织。奥斯基。框架BundleException:捆绑组织中未解决的约束。冬眠核心[8]:无法解决8.0:缺少要求[8.0]osgi。装电线。包裹( 所以我为javax添加了另一个依赖项。企业背景: 解决了之前的错误,但导致了另一个错误: 自动属性安装:file:

  • 这是请求 我试图在我的应用程序中使用上面的ejb 1) 包含JDBC语句2018-03-27 16:28:17,683:错误:http-nio-6180-exec-1:BatchingBatch.PerformExecution:HHH000315:Exception执行批处理[java.sql.BatchUpdateException:batch entry 0 insert into TEAM

  • 如何将Restrictions.in与列表字段一起使用? 这是我的模型: 我尝试只获取具有某些功能的组: 但这会返回一个错误: 引起原因:org.hibernate.exception.GenericJDBCExc0019:在索引:: 1缺少IN或OUT参数org.hibernate.exception.internal.在org.hibernate.engine.jdbc.spi.SqlExce

  • 问题内容: Spring对RDBMS事务管理的支持在Spring WebFlux中是否也起作用? 例如,假设配置正确,带有注释的方法是否会使用Spring事务管理器并在发生错误时回滚事务? 如果事务管理确实起作用,那么方法是否必须实际和异常,或者必须是或返回类型发出错误信号? 我知道JDBC本质上是阻塞的,因此任何JDBC操作都必须从阻塞过渡到反应性,反之亦然。 Spring事务管理器通过使用(对

  • 问题内容: 我想在 独立应用程序* 中将 hibernate 与 嵌入式derby 一起使用,并且我有一些问题: * 我需要什么jar? 必要的hibernate配置是什么? 还有其他必要的配置吗? 查询/条件是否有任何问题/限制? 如果您还可以建议我一些适合这种方法的好教程,那将是可取的,谢谢。 问题答案: 我将Apache Derby与Hibernate一起用于测试项目的一个模型类(它们的 e