Domanda

Vorrei unit test il mio livello di persistenza MyBatis utilizzando un database HSQL in memoria. La vera applicazione utilizza un database Oracle. Questo raffinato lavorato unitl abbiamo iniziato l'aggiunta di numeri auto incrementato per le colonne id. Oracle richiede l'uso di una sequenza per ottenere il numero incrementato in modo da una sequenza denominata basis_seq è stato creato nel database Oracle. Nel mio MyBatis file di mapping XML ho questo:

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

Questo funziona quando faccio funzionare l'applicazione, ma il test di unità ottiene un errore:

org.springframework.jdbc.BadSqlGrammarException

: chiave di selezione Errore o l'impostazione risultato a oggetto parametro. Causa: java.sql.SQLSyntaxErrorException: utente non dispone privilegio o oggetto non trovato: DUAL; grammatica SQL []; l'eccezione annidata è java.sql.SQLSyntaxErrorException: utente non dispone privilegio o oggetto non trovato: DUAL

A quanto ho capito 'DUAL' è una sorta di tabella virtuale in Oracle che memorizza le sequenze e che non hanno questo nel mio database di prova. Se rimuovo il <selectKey>-tag il lavoro di test di unità (dal HSQL può generare automaticamente gli ID per le colonne segnato identity), ma non l'applicazione reale. Una soluzione potrebbe essere quella di creare file MyBatis mapper XML separati per i test di unità senza l'<selectKey>-tag, ma questo è indesiderati perché voglio provare la configurazione reale.

C'è un modo per creare e utilizzare una sequenza in HSQL così o forse qualche MyBatis soluzione per questo? O devo usare un altro database per il mio test di unità come H2?


Io uso:

  • Primavera 3.0.5
  • HSQL 2.2.4
  • MyBatis 3.0.5

UPDATE:

Dopo aver ottenuto la risposta da fredt , ecco come ho modificato la mia configurazione Primavera:

Prima ho definito la mia fonte di dati con:

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

Ora faccio questo:

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

Inoltre, in schema.sql ho bisogno di creare le sequenze:

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

(se si esegue questo script molte volte durante unit test, ricordarsi di aggiungere drop sequence BASIS_SEQ if exists; a inizio schema.sql)

È stato utile?

Soluzione

Ultime HSQLDB offre un'ampia compatibilità sintassi Oracle. Tutto ciò che serve è aggiungere sql.syntax_ora=true al tuo URL del database. Ad esempio:

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

Vedere la Guida

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

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

SQL sintassi compatibilità è costantemente ampliato nelle nuove versioni di HSQLDB, quindi è meglio utilizzare l'ultima versione disponibile.

Altri suggerimenti

È ancora possibile utilizzare la configurazione originale linea 4 utilizzando <jdbc:embedded-database ...>. Basta aggiungere seguente riga all'inizio del file di test-dati / schema.sql:

SET DATABASE SQL SYNTAX ORA TRUE;

Questa è effectivelly stessa aggiungendo sql.syntax_ora=true al JDBC.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top