用HSQL代替Oracle测试MyBatis

我想使用HSQL内存数据库对MyBatis持久层进行单元测试。 真正的应用程序使用Oracle数据库。 这工作得很好,我们开始为id列添加自动递增的数字。 Oracle需要使用序列来获取增加的数字,以便在Oracle数据库中创建一个名为basis_seq的序列。 在我的MyBatis映射XML文件中我有这样的:

<insert id="insertBasis" parameterType="com.foo.Basis" useGeneratedKeys="true" keyProperty="id">
        <selectKey resultType="long" keyProperty="id" order="BEFORE">
            SELECT basis_seq.NEXTVAL FROM DUAL
        </selectKey>
        insert into basis
        (id, name)
        values
        (#{id}, #{name})
</insert>

这在我运行应用程序时有效,但单元测试出现错误:

org.springframework.jdbc.BadSqlGrammarException:选择键或将结果设置为参数对象时出错。 原因:java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:DUAL; 错误的SQL语法[]; 嵌套异常是java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:DUAL

据我所知,'DUAL'是Oracle中的一种虚拟表格,用于存储序列,而我的测试数据库中没有这样的表格。 如果我删除了<selectKey>标记单元测试工作(因为HSQL可以为标记为identity列自动生成identity ),但不是真正的应用程序。 一种解决方法是为单元测试创​​建单独的MyBatis映射器XML文件,而不使用<selectKey> -tag,但这是不受欢迎的,因为我想测试真实的配置。

有没有一种方法可以在HSQL中创建和使用序列,也可以使用MyBatis的一些解决方法? 或者我应该使用另一个数据库来进行像H2这样的单元测试?


我用:

  • Spring 3.0.5
  • HSQL 2.2.4
  • MyBatis 3.0.5

  • 更新:

    fredt得到答案后,我编辑了我的Spring配置:

    在我用以下方式定义数据源之前:

    <jdbc:embedded-database id="dataSource">
        <jdbc:script location="classpath:test-data/schema.sql" />
        <jdbc:script location="classpath:test-data/data.sql" />
    </jdbc:embedded-database>
    

    现在我这样做:

    <bean id="dataSource" 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_ora=true" />
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>
    
    <jdbc:initialize-database data-source="dataSource">
        <jdbc:script location="classpath:test-data/schema.sql" />
        <jdbc:script location="classpath:test-data/data.sql" />
    </jdbc:initialize-database>
    

    另外,在schema.sql中,我需要创建序列:

    CREATE SEQUENCE BASIS_SEQ START WITH 1000 INCREMENT BY 1;
    CREATE SEQUENCE OTHER_SEQ START WITH 1000 INCREMENT BY 1;
    

    (如果您在单元测试期间多次运行此脚本,请记住添加drop sequence BASIS_SEQ if exists;将其添加到drop sequence BASIS_SEQ if exists;顶部)


    最新的HSQLDB提供了广泛的Oracle语法兼容性。 您只需sql.syntax_ora=true添加到您的数据库URL。 例如:

    jdbc:hsqldb:mem:test;sql.syntax_ora=true
    

    请参阅指南

    http://hsqldb.org/doc/2.0/guide/deployment-chapt.html

    http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

    SQL语法兼容性在HSQLDB的新版本中不断扩展,因此最好使用最新的可用版本。


    您仍然可以使用<jdbc:embedded-database ...>原始4行配置。 只需在test-data / schema.sql文件的开头添加以下行:

    SET DATABASE SQL SYNTAX ORA TRUE;
    

    这与将sql.syntax_ora=true附加到您的JDBC URL的效果相同。

    链接地址: http://www.djcxy.com/p/88623.html

    上一篇: Unit test MyBatis with HSQL instead of Oracle

    下一篇: How to read NDEF messages in pN512 based Explore