Pregunta

Me gustaría probar mi capa de persistencia mybatis utilizando una base de datos HSQL en memoria. La aplicación real usa una base de datos Oracle. Esto funcionó bien unidades, comenzamos a agregar números automáticos para las columnas de identificación. Oracle requiere el uso de una secuencia para obtener el número incrementado, por lo que se creó una secuencia llamada BASE_SEQ en la base de datos Oracle. En mi archivo XML MyBatis mapper tengo esto:

<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 ejecuto la aplicación, pero la prueba unitaria recibe un error:

org.springframework.jdbc.badsqlgrammarException: Error de selección de la clave o configuración del resultado en el objeto de parámetro. Causa: java.sql.sqlsyntaxerRorException: el usuario carece de privilegios u objeto no encontrado: dual; gramática SQL mala []; La excepción anidada es java.sql.sqlsyntaxerrorexception: el usuario carece de privilegio u objeto no encontrado: dual

Según tengo entendido, 'dual' es algún tipo de tabla virtual 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 unitario (ya que HSQL puede autogenerar ID para columnas marcadas identity) pero no la aplicación real. Una solución alternativa sería crear archivos XML myBatis myBatis separados para las pruebas unitarias sin el <selectKey>-TAG Pero esto no se ha deseado ya que quiero probar la configuración real.

¿Hay alguna manera de crear y usar una secuencia en HSQL también o tal vez algo de solución mybatis para esto? ¿O debo usar otra base de datos para mi prueba unitaria como H2?


Yo suelo:

  • Primavera 3.0.5
  • HSQL 2.2.4
  • Mybatis 3.0.5

ACTUALIZAR:

Después de obtener la respuesta de Fredt, así es como edité mi configuración de primavera:

Antes de definir 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 este script muchas veces durante las pruebas unitarias, recuerde agregar drop sequence BASIS_SEQ if exists; a la parte superior del esquema.sql)

¿Fue útil?

Solución

El último HSQLDB proporciona una extensa compatibilidad de sintaxis Oracle. Todo lo que necesitas es agregar sql.syntax_ora=true a la url de su base de datos. Por ejemplo:

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

Ver la guía

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

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

La compatibilidad de sintaxis SQL se extiende constantemente en nuevas versiones de HSQLDB, por lo que es mejor usar la última versión disponible.

Otros consejos

Todavía puede usar su configuración original de 4 líneas usando <jdbc:embedded-database ...>. Simplemente agregue la línea siguiente al comienzo de su archivo de prueba/esquema.sql:

SET DATABASE SQL SYNTAX ORA TRUE;

Esto es efectivo y lo mismo que agregar sql.syntax_ora=true a tu URL JDBC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top