【发布时间】: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