java - 回滚 ORMapper 查询

标签 java orm transactions rollback mybatis

我们使用 MyBatis (3.0.5) 作为我们的或映射工具(对此我没有任何意见!)。

我创建了一个 Response 对象,通过 MyBatis,映射到我们的 [responses] 数据库表(我们使用 PostgreSQL)。

实际上,我们使用的ormapping结构如下:

  • ResponseMapper.xml - 这是定义 PSQL 查询并将其映射到 ResponseMapper.java** 类及其方法的 XML 文件
  • ReponseMapper.java - MyBatis 用于执行 XML 文件(上面)中定义的查询的接口(interface)
  • ResponseDAO.java - 用于 DI 目的的接口(interface)(我们使用 Spring)
  • ResponseDAOImpl.java - 实际上调用 ResponseMapper 方法的 ResponseDAO 的具体实现;我们使用 Spring 将此类的实例注入(inject)到我们的应用程序中

因此,要将新的 [responses] 记录插入 PostgreSQL,调用组件的代码如下所示:

@Autowired
private ResponseDAO response;

public void doStuff()
{
    int action = getAction();

    response.setAction(action);

    response.insert();
}

这个设置对我们来说效果很好。不过,我现在正在尝试为 ResponseDAOImpl 类编写一组 JUnit 测试,并且我想确保它正确执行对 PostgreSQL 数据库的查询。

据我所知,没有办法“模拟”整个数据库。因此,我唯一的选择(似乎)是让测试方法执行查询,检查是否成功,然后无论如何将其回滚。

MyBatis 似乎不支持这种回滚功能。我发现this在 Old Nabble 上的 mybatis-user 邮件列表中发帖,但发帖者使用的是 Guice,他/她的问题似乎更多是关于通过 Guice 回滚交易。

如果 MyBatis 支持事务/回滚(支持吗?!?!),那么似乎我唯一的替代就是 PostgreSQL-JDBC 驱动程序支持这些。我想我可以尝试配置我的测试方法,以便它们运行 ResponseDAO.insert() 方法,然后手动尝试直接通过驱动程序回滚事务(无 MyBatis)。

SO 有这方面的经验吗?代码示例?尖端?最佳实践?提前致谢!

最佳答案

MyBatis 允许在使用“SqlSession”时进行回滚,问题在于您使用了 spring 依赖注入(inject)部分,它会在方法完成时自动提交事务。

您有几个选择,其中

  1. 注入(inject)依赖项的模拟。有一些很棒的库可以帮助解决这个问题。喜欢Mockito , here is a good question on Spring Mockito stuff 。这将测试您的 java 中的业务逻辑,但不会测试您的实际查询。

  2. 提交您的查询,并在测试运行后删除您的数据。这是我们采用的方法,因为它也测试我们的数据库。显然,您需要数据库的测试实例,而有些人没有。

  3. 您可以尝试为在 MyBatis Spring Integration 中执行自动提交的类提供自己的测试绑定(bind),并覆盖那里的行为,以便在测试环境中该行为是回滚查询而不是提交。 Guice 集成中使用了类似的方法,描述为 here .

关于java - 回滚 ORMapper 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8580260/

相关文章:

php - Doctrine2,传递 Id 还是对象?

.net - 我可以重复使用交易吗?如何?

JAVA:如何按字母顺序对从文件读取并输出到控制台的字符串进行排序?

java - java中哪个线程安全队列效率更高

java - 如何配置主键和外键之间的一对一关系?

java - 在 Android 上计算文件中的 XML 元素

orm - Sequelize - where 子句中的子查询

c# - 哪个 ORM 支持这个

magento - Magento 订单系统中的交易

sql-server - 嵌套事务的目的