我想使用HSQL内存数据库对MyBatis持久层进行单元测试.真正的应用程序使用Oracle数据库.这工作正常,我们开始为id列添加自动递增的数字. Oracle需要使用序列来获取递增的数字,因此在Oracle数据库中创建了一个名为basis_seq的序列.在我的MyBatis mapper
XML文件中我有这个:
SELECT basis_seq.NEXTVAL FROM DUAL
insert into basis
(id, name)
values
(#{id}, #{name})
当我运行应用程序但是单元测试发生错误时,这可以工作:
org.springframework.jdbc.BadSqlGrammarException: Error selecting key
or setting result to parameter object. Cause:
java.sql.SQLSyntaxErrorException: user lacks privilege or object not
found: DUAL ; bad SQL grammar []; nested exception is
java.sql.SQLSyntaxErrorException: user lacks privilege or object not
found: DUAL
据了解,“DUAL”是甲骨文中存储序列的某种虚拟表,我的测试数据库中没有.如果我删除< selectKey> -tag单元测试工作(因为HSQL可以自动生成标记为身份的列的id),而不是真正的应用程序.一个解决方法是为单位测试创建单独的MyBatis映射程序XML文件,而不使用< selectKey> -tag,但这是不希望的,因为我想测试真正的配置.
有没有办法在HSQL中创建和使用序列,也可能有一些MyBatis的解决方法?或者我应该使用另一个数据库进行单元测试,如H2?
我用:
> Spring 3.0.5
> HSQL 2.2.4
> MyBatis 3.0.5
更新:
从fredt得到答案后,我是如何编辑我的Spring配置的:
在我定义了我的数据源之前:
现在我这样做:
destroy-method="close">
另外,在schema.sql中我需要创建序列:
CREATE SEQUENCE BASIS_SEQ START WITH 1000 INCREMENT BY 1;
CREATE SEQUENCE OTHER_SEQ START WITH 1000 INCREMENT BY 1;
(如果在单元测试期间多次运行此脚本,请记住添加下拉序列BASIS_SEQ(如果存在);在schema.sql的顶部)