【问题标题】:Using hsqldb with Ibatis to test a configuration that relies on Postgres in production使用 hsqldb 和 Ibatis 测试在生产中依赖 Postgres 的配置
【发布时间】:2012-06-04 20:30:43
【问题描述】:

目前测试环境有迁移依赖DBunit + HSQLDB。我遇到了Nextval 问题。我的ibatis配置文件是这样的:

<select id="selectTestKey" resultMap="integerResult">
        select nextval('test_seq') as integer
    </select>

我的 Spring 映射文件如下所示:

<bean id="testDS" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
        <property name="url" value="jdbc:hsqldb:mem:test;sql.syntax_pgs=true" />
        <property name="username" value="SA" />
        <property name="password" value="" />
    </bean>

相关的休眠错误:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error preparing statement.  Cause: org.hibernate.exception.SQLGrammarException: user lacks privilege or object not found: NEXTVAL

这对 Postgres 数据库有效,但对 HSQLDB 失败。该网站上的其他答案没有为我提供解决方案。

使用以下maven config获取hsqldb:

<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>2.2.8</version>
</dependency>

【问题讨论】:

  • 为什么不对 PostgreSQL 进行测试呢?它会更简单,更安全。当然,执行测试会稍长一些,但这就是存在持续集成的原因。
  • @JBNizet 因为不能保证我们会继续使用 PostgreSQL。我不相信我的情况超出了使用 DBUnit 的标准范围。问题是它无法运行测试,这证明了需要解决的依赖关系。
  • 你留在HsqlDB上的保障就更少了。该问题与 DBUnit 或缺少依赖项无关。问题是您已经编写了应该在 PostgreSQL 上运行的代码,至少现在是这样。但是你用 HsqlDB 测试它,它有其他规则、另一种语法、其他数据类型。如果你在一条古老的小林道上测试一级方程式,你会发现一级方程式有很多问题,但它本来就不应该在小林道上骑行。您应该在应该骑行的地方测试公式 1:在公式 1 赛道上。
  • @JBNizet 是的,感谢您做出人为的评论回复。您可能没有意识到这一点,但sql.syntax_pgs=true 来自文档:此属性设置为 true 时,将支持 TEXT 和 SERIAL 类型。它还支持 NEXTVAL、CURRVAL 和 LASTVAL 语法,还允许与该方言的某些其他方面兼容。 hsqldb.org/doc/2.0/guide/dbproperties-chapt.html 除非我误解了文档。
  • @JBNizet 所有汽车在上路测试之前和同时都在实验室的各种平台上进行测试。当开发人员使用 HSQLDB 进行测试时,并不意味着他们不在目标数据库上进行测试。

标签: java hibernate postgresql hsqldb dbunit


【解决方案1】:

NEXTVAL 等都在 Posgres 兼容模式下工作。您可以通过双击 hsqldb.jar 并使用您的 URL、CREATE SEQUENCE 语句和 NEXTVAL 语句检查 GUI DatabaseManager 来验证。

可能实际使用的HSQLDB版本早于2.2.8,不支持NEXTVAL功能。您可以对 URL 添加检查,如果数据库不支持给定的语法属性,则会导致连接失败。

jdbc:hsqldb:mem:test;sql.syntax_pgs=true;check_props=true

也有可能是完整的 URL 没有发送到 HSQLDB,如果上面的 URL 连接就会出现这种情况,但是 NEXTVAL 不起作用。

【讨论】:

  • 我明白了,如何将完整的 url 强制输入 HSQLDB?
  • 如果带有 check_props=true 的扩展 URL 没有失败,则需要执行此操作。在那种情况下,找出 DBCP 对 URL 做了什么,我不太了解。但请尝试将属性添加到数据源定义,而不是 URL。
猜你喜欢
  • 2012-02-13
  • 2014-06-02
  • 2011-09-27
  • 2011-08-31
  • 1970-01-01
  • 2016-03-27
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多