Luw*_*wil 14 oracle hsqldb 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>
Run Code Online (Sandbox Code Playgroud)
这在我运行应用程序但单元测试出错时起作用:
org.springframework.jdbc.BadSqlGrammarException:选择键或将结果设置为参数对象时出错.原因:java.sql.SQLSyntaxErrorException:user缺少未找到的权限或对象:DUAL; 糟糕的SQL语法[]; 嵌套异常是java.sql.SQLSyntaxErrorException:user缺少未找到的权限或对象:DUAL
据我所知,'DUAL'是Oracle中存储序列的某种虚拟表,我在测试数据库中没有这个.如果我删除<selectKey>-tag单元测试工作(因为HSQL可以为标记的列自动生成id identity)但不是真正的应用程序.一种解决方法是为单元测试创建单独的MyBatis映射器XML文件而不使用<selectKey>-tag,但这是不希望的,因为我想测试真实的配置.
有没有办法在HSQL中创建和使用序列,或者为此可能有一些MyBatis解决方法?或者我应该像H2一样使用其他数据库进行单元测试?
我用:
从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>
Run Code Online (Sandbox Code Playgroud)
现在我这样做:
<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>
Run Code Online (Sandbox Code Playgroud)
另外,在schema.sql中我需要创建序列:
CREATE SEQUENCE BASIS_SEQ START WITH 1000 INCREMENT BY 1;
CREATE SEQUENCE OTHER_SEQ START WITH 1000 INCREMENT BY 1;
Run Code Online (Sandbox Code Playgroud)
(如果在单元测试期间多次运行此脚本,请记住添加drop sequence BASIS_SEQ if exists;到schema.sql的顶部)
fre*_*edt 12
最新的HSQLDB提供了广泛的Oracle语法兼容性.您只需添加sql.syntax_ora=true到数据库URL即可.例如:
jdbc:hsqldb:mem:test;sql.syntax_ora=true
Run Code Online (Sandbox Code Playgroud)
请参阅指南
http://hsqldb.org/doc/2.0/guide/deployment-chapt.html
http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html
在新版本的HSQLDB中不断扩展SQL语法兼容性,因此最好使用最新的可用版本.
| 归档时间: |
|
| 查看次数: |
10616 次 |
| 最近记录: |