2011-10-19 17 views
14

me gustaría probar mi unidad de capa de persistencia MyBatis utilizando una base de datos en memoria HSQL. La aplicación real usa una base de datos Oracle. Esto funcionó bien. Comenzamos a agregar números automáticos incrementados para las columnas de id. Oracle requiere el uso de una secuencia para obtener el número incrementado, por lo que se creó una secuencia llamada basis_seq en la base de datos Oracle. En mi MyBatis archivo asignador XML tengo esto:Unidad MyBatis prueba con HSQL en lugar de 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> 

Esto funciona cuando corro la aplicación, pero la prueba de la unidad obtiene un error:

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

Según entiendo 'dual' es una especie de virtuales tabla en Oracle que almacena las secuencias y no tengo esto en mi base de datos de prueba. Si quito el <selectKey> -tag el trabajo de prueba de unidad (ya HSQL puede autogenerar los identificadores para las columnas marcadas identity), pero no la aplicación real. Una solución alternativa sería crear archivos XML MyBatis mapper separados para las pruebas unitarias sin el <selectKey> -tag, pero esto no es deseado ya que quiero probar la configuración real.

¿Hay una manera de crear y utilizar una secuencia en HSQL tan bien o tal vez algo de solución MyBatis para esto? ¿O debería usar otra base de datos para mi prueba de unidad como H2?


que utilizo:

  • primavera 3.0.5
  • HSQL 2.2.4
  • MyBatis 3.0.5

ACTUALIZACIÓN:

Después de conseguir la respuesta de fredt, aquí es cómo editado mi configuración de Spring:

Antes he definido mi fuente de datos 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> 

Ahora hago esto:

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

Además, en schema.sql necesito crear las secuencias:

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

(si ejecuta esta secuencia de comandos muchas veces durante la prueba de la unidad, recuerde agregar drop sequence BASIS_SEQ if exists; a la parte superior de schema.sql)

+1

Luwil: Sabe que puede agregar una respuesta a su propia pregunta, si desea compartir la solución que aplicó a su pregunta ... –

Respuesta

12

La última HSQLDB proporciona una amplia compatibilidad de sintaxis Oracle. Todo lo que necesita es agregar sql.syntax_ora=true a la URL de su base de datos.Por ejemplo:

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

Consulte la guía

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

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

compatibilidad de sintaxis SQL se amplía continuamente en nuevas versiones de HSQLDB, así que es mejor utilizar la última versión disponible.

+0

Gracias @fredt, funciona como un encanto. Para otras personas que usan Spring, agregaré texto a mi pregunta que detalla cómo modifiqué mi configuración (es difícil obtener el formato correcto en un comentario). – Luwil

2

Puede seguir utilizando la configuración original de 4 líneas con <jdbc:embedded-database ...>. Sólo tiene que añadir siguiente línea al principio de su archivo/schema.sql prueba de los datos:

SET DATABASE SQL SYNTAX ORA TRUE; 

Ésta es effectivelly misma como anexar sql.syntax_ora=true a su URL de JDBC.