Chciałbym przetestować moją warstwę trwałości MyBatis za pomocą bazy danych HSQL w pamięci. Prawdziwa aplikacja korzysta z bazy danych Oracle. To działało dobrze unitl zaczęliśmy dodawanie auto inkrementowanych liczb dla kolumn id. Oracle wymaga użycia sekwencji, aby uzyskać zwiększany numer, tak aby w bazie danych Oracle utworzono sekwencję o nazwie basis_seq. W moim MyBatis pliku mapowania XML mam to:Test jednostkowy MyBatis z HSQL zamiast 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>
Działa to po uruchomieniu aplikacji, ale test jednostki dostaje błąd:
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
Jak rozumiem „podwójnego” jest pewnego rodzaju wirtualne tabela w Oracle, która przechowuje sekwencje i nie mam tego w mojej testowej bazie danych. Jeśli usuniemy <selectKey>
-tag pracy testu urządzenia (ponieważ HSQL może automatycznie generować identyfikatory dla kolumn oznaczonych identity
), ale nie jest to prawdziwa aplikacja. Jednym obejściem byłoby utworzenie oddzielnych plików XML mapera MyBatis dla testów jednostkowych bez etykiety <selectKey>
, ale jest to niepożądane, ponieważ chcę przetestować prawdziwą konfigurację.
Czy istnieje sposób na tworzenie i używanie sekwencji w HSQL, a może jakaś metoda obejścia tego problemu w MyBatis? Czy powinienem użyć innej bazy danych do testu jednostkowego, takiego jak H2?
używam:
- Wiosna 3.0.5
- HSQL 2.2.4
- MyBatis 3.0.5
UPDATE:
Po otrzymaniu odpowiedzi od fredt, oto jak ja edytowane moją konfigurację wiosny:
Zanim zdefiniowane moje źródło danych z:
<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>
:
<jdbc:embedded-database id="dataSource">
<jdbc:script location="classpath:test-data/schema.sql" />
<jdbc:script location="classpath:test-data/data.sql" />
</jdbc:embedded-database>
Teraz mogę to zrobić Również w schemacie.sql muszę utworzyć sekwencje:
CREATE SEQUENCE BASIS_SEQ START WITH 1000 INCREMENT BY 1;
CREATE SEQUENCE OTHER_SEQ START WITH 1000 INCREMENT BY 1;
(jeśli wielokrotnie uruchamiasz ten skrypt podczas testowania urządzenia, pamiętaj, aby dodać drop sequence BASIS_SEQ if exists;
do początku schematu.sql)
Luwil: Wiesz, że możesz dodać odpowiedź na własne pytanie, jeśli chcesz udostępnić rozwiązanie zastosowane do pytania ... –