Я бы хотел провести модульное тестирование моего уровня персистентности MyBatis с использованием базы данных HSQL в памяти.Настоящее приложение использует базу данных Oracle.Это работало нормально, пока мы не начали добавлять автоматически увеличивающиеся числа для столбцов идентификаторов.Oracle требует использования последовательности для получения увеличенного числа, поэтому в базе данных Oracle была создана последовательность с именем base_seq.В моем XML-файле MyBatis Mapper у меня есть это:
<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
), но не для реального приложения.Одним из обходных путей может быть создание отдельных XML-файлов MyBatis mapper для модульных тестов без тега <selectKey>
, но это нежелательно, поскольку я хочу проверить реальную конфигурацию.
Есть ли способ создания и использованияпоследовательность в HSQL или, может быть, какой-то обходной путь MyBatis для этого?Или я должен использовать другую базу данных для моего модульного теста, например H2?
Я использую:
- Spring 3.0.5
- HSQL 2.2.4
- MyBatis 3.0.5
ОБНОВЛЕНИЕ:
После получения ответа от Фредт , вот как я отредактировал свою конфигурацию 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;
в начало схемы.sql)