hsql mybatis 表不存在_单元测试MyBatis与HSQL而不是Oracle

在使用HSQL进行MyBatis的单元测试时遇到Oracle序列DUAL表不存在的问题,导致测试失败。文章讨论了这个问题,并提出了通过在HSQL中创建序列以及修改Spring配置来解决的方法,同时探讨了是否应选择其他数据库如H2进行单元测试。
摘要由CSDN通过智能技术生成

我想使用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的顶部)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值