Вопрос

Я хотел бы проверить мой слой настойчивости Mybatis, используя базу данных HSQL в памяти. Реальное приложение использует базу данных Oracle. Это сработало Fine Unitl, мы начали добавлять автоматические увеличенные числа для столбцов идентификатора. Oracle требует использования последовательности, чтобы получить увеличенное число, поэтому в базе данных Oracle была создана последовательность, называемая base_seq. В моем файле Mybatis Mapper 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: пользователю не хватает привилегий или объекта, не найденного: двойной; плохая грамматика SQL []; Вложенное исключение - java.sql.sqlsyntaxerrorexception: пользователю не хватает привилегий или объекта, не найденного: двойной

Как я понимаю, «двойной» - это своего рода виртуальная таблица в Oracle, в которой хранится последовательности, и у меня нет этого в моей тестовой базе данных. Если я удалю <selectKey>-Таг в модульном тестировании (поскольку HSQL может автогенерировать идентификаторы для столбцов, отмеченных identity) но не реальное приложение. Один обходной путь - это создание отдельных файлов Mybatis Mapper XML для модульных тестов без <selectKey>-Таг, но это нежелательно, так как я хочу проверить реальную конфигурацию.

Есть ли способ создать и использовать последовательность в HSQL или, может быть, какой -нибудь обходной путь Mybatis для этого? Или я должен использовать другую базу данных для моего модульного теста, например, H2?


Я использую:

  • Весна 3.0.5
  • HSQL 2.2.4
  • Mybatis 3.0.5

ОБНОВИТЬ:

После получения ответа от Фредт, вот как я отредактировал свою пружинную конфигурацию:

Прежде чем я определил свой источник данных с помощью:

<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)

Это было полезно?

Решение

Последний 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, поэтому лучше всего использовать последнюю доступную версию.

Другие советы

Вы все еще можете использовать свою исходную конфигурацию 4 линии, используя <jdbc:embedded-database ...>. Анкет Просто добавьте следующую строку в начале вашего файла Test-Data/Schema.sql:

SET DATABASE SQL SYNTAX ORA TRUE;

Это так же, как добавление sql.syntax_ora=true к вашему URL JDBC.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top