質問

HSQL インメモリ データベースを使用して MyBatis 永続層の単体テストをしたいと考えています。実際のアプリケーションは Oracle データベースを使用します。ID 列に自動増分番号を追加し始めた限り、これはうまく機能しました。Oracle では、インクリメントされた数値を取得するためにシーケンスを使用する必要があるため、Oracle データベースに「basic_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>

これはアプリケーションを実行すると機能しますが、単体テストでエラーが発生します。

org.springframework.jdbc.BadSqlGrammarException:キーの選択または[[結果]をパラメーターオブジェクトに設定するエラー。原因:java.sql.SQLSyntaxErrorException:ユーザーには特権やオブジェクトが見つかりません:デュアル;間違った SQL 文法 [];ネストされた例外はjava.sql.sqlsyntaxerrorexceptionです。ユーザーには特権やオブジェクトが見つかりません:デュアル

私が理解しているように、「DUAL」はシーケンスを保存するOracleのある種の仮想テーブルであり、テストデータベースにはこれがありません。を削除すると、 <selectKey>- 単体テストの動作にタグを付けます (HSQL はマークされた列の ID を自動生成できるため) identity) しかし、実際のアプリケーションではありません。回避策の 1 つは、単体テスト用に別の MyBatis マッパー XML ファイルを作成することです。 <selectKey>-tag ですが、実際の構成をテストしたいので、これは望ましくありません。

HSQL でもシーケンスを作成して使用する方法はありますか、あるいはこれに対する MyBatis の回避策はありますか?それとも、単体テストには H2 などの別のデータベースを使用する必要がありますか?


私が使う:

  • スプリング 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; schema.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;

これは、Appendingと同じです sql.syntax_ora=true JDBC URLに。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top