DAOのユニットテストを実行しようとしています(SpringとHibernateを使用)。 this チュートリアルごとにHSQLDBを使用しています。このチュートリアルでは、インメモリHSQLDBデータベースはSQLスクリプトを使用して初期化できると述べていますが、Springでその方法に関する情報を見つけることができません。適切なSpringコンテキスト設定は次のとおりです。
<bean id="dataSource" class="org.Apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:mydb" />
<property name="username" value="sa" />
<property name="password" value="" />
<property name="initialSize" value="5" />
<property name="maxActive" value="10" />
<property name="poolPreparedStatements" value="true" />
<property name="maxOpenPreparedStatements" value="10" />
</bean>
任意の助けをいただければ幸いです。ありがとう。
インメモリデータベースとSpringを使用する場合、新しい Spring 3のjdbc
名前空間 があり、組み込みデータベースの操作が非常に簡単になります。
最良の部分は、DataSource
として機能するため、既存のdataSource
Beanを簡単に置き換えることができます。
<jdbc:embedded-database id="dataSource" type="HSQL">
<jdbc:script location="classpath:schema.sql"/>
<jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>
Java Configでこれを行うことに興味がある場合は、 EmbeddedDatabaseBuilder (Spring 3.0の新機能)を参照してください。
@Configuration
public class DatabaseTestConfig {
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:schema.sql")
.addScript("classpath:test-data.sql")
.build();
}
}
ニコラスの答えはまったく問題ありませんが、jdbc
名前空間を使用して外部データベースも初期化できます。
<jee:jndi-lookup id="dataSource" jndi-name="Java:comp/env/jdbc/DS"/>
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:/META-INF/database/init.sql"/>
</jdbc:initialize-database>
リンクするチュートリアルで、設定の方法の1つは次のとおりです(明らかな修正後)。
- スクリプトからのメモリ内:
jdbc:hsqldb:file:path-to-file
それは関連があるように思われると思います。 path-to-file
完全修飾ファイル名のように見えるもの…
これを回避するには、 BasicDataSource
のサブクラスを作成し、2つの新しいプロパティinitExecuteSqlFile
とdestroyExecuteSqlFile
のゲッター/セッターを使用します。実行するSQLファイルのコンマ区切りリスト。サブクラスには、init/destroy SQLファイルを処理するinit()
およびdestroy()
メソッドがあります。
次に、次のBean定義を使用します。
<bean
id="datasource"
class="com.example.MyBasicDataSource"
destroy-method="destroy"
init-method="init"
>
<property name="destroyExecuteSqlFile">
<value>h2-destroy-01.sql</value>
</property>
<property name="initExecuteSqlFile">
<value>h2-init-01.sql,h2-init-02.sql,h2-init-03.sql</value>
</property>
<!-- Other properties -->
</bean>
組み込みデータベースでは、同じJVMからのみデータベースに接続できます。パフォーマンスまたはその他の制約のために2つのJVMがある場合、次のことができます。
埋め込みデータベースを使用する代わりに、 この回答 で提案されているデータソースを使用できます。
次に Poitrek De のように初期化します(および 前の回答 でも推奨されます)。テーブルが存在しない場合にのみ作成することもできます( here を推奨)。