Frage

Ich möchte meine MyBatis-Persistenzschicht mit einer HSQL-In-Memory-Datenbank testen. Die reale Anwendung verwendet eine Oracle -Datenbank. Dies funktionierte feine Unitl. Wir haben mit automatisch inkrementierten Nummern für die ID -Spalten hinzugefügt. Oracle benötigt die Verwendung einer Sequenz, um die inkrementierte Zahl zu erhalten, sodass in der Oracle -Datenbank eine Sequenz namens Basis_seq erstellt wurde. In meiner MyBatis Mapper XML -Datei habe ich Folgendes:

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

Dies funktioniert, wenn ich die Anwendung ausführe, der Unit -Test erhält jedoch einen Fehler:

org.springframework.jdbc.badsqlgrammarexception: Fehler beim Auswählen von Schlüssel oder Einstellung von Ergebnis in Parameterobjekt. Ursache: java.sql.sqlsyntaxerRorexception: Benutzer fehlt ein Privileg oder Objekt nicht gefunden: Dual; schlechte SQL -Grammatik []; verschachtelte Ausnahme ist java.sql.sqlsyntaxerRorexception: Benutzer fehlt ein Privileg oder Objekt nicht gefunden: Dual

Wie ich verstehe, ist 'Dual' eine Art virtueller Tabelle in Oracle, die die Sequenzen speichert, und ich habe dies nicht in meiner Testdatenbank. Wenn ich das entferne <selectKey>-Tag die Unit -Testarbeit (da HSQL IDs für markierte Spalten autogenerieren kann identity) aber nicht die wirkliche Anwendung. Eine Problemumgehung wäre, separate MyBatis -Mapper -XML -Dateien für die Unit -Tests ohne die zu erstellen <selectKey>-Tag, aber das ist unerwünscht, da ich die reale Konfiguration testen möchte.

Gibt es eine Möglichkeit, auch eine Sequenz in HSQL oder vielleicht eine MyBatis -Problemumgehung dafür zu erstellen und zu verwenden? Oder sollte ich eine andere Datenbank für meinen Unit -Test wie H2 verwenden?


Ich benutze:

  • Frühling 3.0.5
  • HSQL 2.2.4
  • MyBatis 3.0.5

AKTUALISIEREN:

Nachdem die Antwort von der Antwort erhalten hatte Fredt, Hier ist, wie ich meine Frühlingskonfiguration bearbeitet habe:

Bevor ich meine Datenquelle definierte mit:

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:test-data/schema.sql" />
    <jdbc:script location="classpath:test-data/data.sql" />
</jdbc:embedded-database>

Jetzt mache ich das:

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

Auch in Schema.sql muss ich die Sequenzen erstellen:

CREATE SEQUENCE BASIS_SEQ START WITH 1000 INCREMENT BY 1;
CREATE SEQUENCE OTHER_SEQ START WITH 1000 INCREMENT BY 1;

(Wenn Sie dieses Skript während der Einheitstests oft ausführen, denken Sie daran, hinzuzufügen drop sequence BASIS_SEQ if exists; bis Sop of Schema.sql)

War es hilfreich?

Lösung

Die neueste HSQLDB bietet eine umfassende Kompatibilität der Oracle -Syntax. Alles was Sie brauchen ist hinzuzufügen sql.syntax_ora=true zu Ihrer Datenbank -URL. Zum Beispiel:

jdbc:hsqldb:mem:test;sql.syntax_ora=true

Siehe Leitfaden

http://hsqldb.org/doc/2.0/guide/deployment-chapt.html

http://hsqldb.org/doc/2.0/guide/dbproperties-tmapt.html

Die Kompatibilität der SQL -Syntax wird ständig in neuen Versionen von HSQLDB erweitert. Die neueste verfügbare Version verwenden daher am besten.

Andere Tipps

Sie können Ihre ursprüngliche 4 -Zeilen -Konfiguration weiterhin verwenden <jdbc:embedded-database ...>. Fügen Sie einfach zu Beginn Ihrer Testdaten/schema.sql-Datei die folgende Zeile hinzu:

SET DATABASE SQL SYNTAX ORA TRUE;

Dies ist effektiv wie angehängt sql.syntax_ora=true zu Ihrer JDBC -URL.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top