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)
Luwil: Sabe que puede agregar una respuesta a su propia pregunta, si desea compartir la solución que aplicó a su pregunta ... –