2011-10-19 6 views
14

Vorrei testare il mio livello di persistenza MyBatis utilizzando un database in memoria HSQL. La vera applicazione utilizza un database Oracle. Questo ha funzionato bene unitl abbiamo iniziato ad aggiungere numeri auto incrementati per le colonne id. Oracle richiede l'uso di una sequenza per ottenere il numero incrementato in modo che una sequenza chiamata basis_seq sia stata creata nel database Oracle. Nel mio MyBatis file di mapping XML ho questo:Test unità MyBatis con HSQL anziché Oracle

<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: Error selecting key or setting result to parameter object. Cause: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: DUAL ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: DUAL

quanto ho capito 'DOPPIO' è una sorta di virtuale tabella in Oracle che memorizza le sequenze e non ho questo nel mio database di test. Se rimuovo lo <selectKey> -tag il lavoro di test delle unità (poiché HSQL può generare automaticamente id per le colonne contrassegnate con identity) ma non l'applicazione reale. Una soluzione alternativa sarebbe quella di creare file XML mapper MyBatis separati per i test unitari senza lo <selectKey> -tag, ma questo è indesiderato dal momento che voglio testare la configurazione reale.

C'è un modo per creare e utilizzare una sequenza in HSQL o forse qualche soluzione MyBatis per questo? O dovrei usare un altro database per il mio test unitario 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, nello 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 più volte durante il test dell'unità, ricordarsi di aggiungere drop sequence BASIS_SEQ if exists; all'inizio di schema.sql)

+1

Luwil: Sai che puoi aggiungere una risposta alla tua domanda, se vuoi condividere la soluzione che hai applicato alla tua domanda ... –

risposta

12

L'ultimo HSQLDB offre un'ampia compatibilità di sintassi Oracle. Tutto ciò di cui hai bisogno è aggiungere sql.syntax_ora=true al tuo URL del database.Per esempio:

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

consultare la Guida

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

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

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

+0

Grazie a @fredt, funziona come un fascino. Per gli altri che usano Spring, aggiungerò del testo alla mia domanda che spiega come ho cambiato la mia configurazione (difficile ottenere la formattazione giusta in un commento). – Luwil

2

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

SET DATABASE SQL SYNTAX ORA TRUE; 

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