2

目前在测试环境中有一个迁移依赖 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 配置获取 hsqldb:

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

1 回答 1

2

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 不起作用。

于 2012-05-30T17:30:32.057 回答