プロジェクトで hsqldb を使用しており、うまく機能しています。現在、インプロセス ファイル データベースを使用するように構成されており、DriverManagerDataSource、LocalContainerEntityManagerFactoryBean、および TransactionManager はすべて、コンテキスト XML ファイルで Bean としてインスタンス化されています。
<bean id="databaseValidator" class="com.apps.database.DatabaseValidator"></bean>
<bean id="dataSource" depends-on="databaseValidator" class="com.apps.database.DriverManagerDataSourceWithDirectory">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:file:db/theDB" />
<property name="username" value="--------" />
<property name="password" value="--------" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.apps.model.logic</value>
<value>com.apps.jpa</value>
</list>
</property>
<property name="mappingResources">
<list>
<value>Setting.hbm.xml</value>
</list>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="HSQL" />
</bean>
</property>
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
新しいエンティティを導入したり、既存のエンティティのフィールドを変更したりして、データベース スキーマを変更する必要がある場合は常に注意が必要です。つまり、すべての開発者は、開発環境でファイル データベースの既存のコピーを削除し、更新されたコピーを再挿入する必要があります。アプリケーションの起動時に、既存の DB ファイルに接続する前に正しいスキーマがあるかどうかを確認できるように、これを自動プロセスにしたいと考えています。実際、アプリが起動するたびにデータベースのスキーマを検証して、エンドユーザー (非開発環境) がデータベースを現在のスキーマに移行できるようにしたいと考えています。
これを実現するために、コード内の EntityManagerFactory を作成して「afterPropertiesSet」を呼び出すことにより、スキーマを検証しようとする他の何よりも先に起動する Bean (databaseValidator - 上と下を参照) を作成しました。これは実際にトリックを実行します。スキーマに不一致がある場合は失敗し、スキーマが有効な場合は成功します。これは機能しますが、データベース ファイルを保持しているため、それらを削除して更新されたデータベース ファイルに置き換えることはできません。ファイルを削除できないため、更新されたファイル データベースに置き換えることはできません。
全体として、これは、ファイル データベースに接続する前にそのスキーマを検証する最善の方法ではないと感じています。スキーマが有効かどうかを判断するために、既存の EntityManagerFactory (上記の XML ファイルで定義されている) を利用したいと思うかもしれませんが、それが有効であるという例外に便乗する方法がわかりません。投げます。ファイルデータベースのスキーマをプログラムでテストする方法について、より良い提案はありますか?
private boolean isTheSchemaValid() {
boolean isValid = false;
LocalContainerEntityManagerFactoryBean emf = null;
try {
emf = new LocalContainerEntityManagerFactoryBean();
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:file:db/theDB");
dataSource.setUsername("--------");
dataSource.setPassword("--------");
emf.setDataSource(dataSource);
Properties jpaProperties = new Properties();
jpaProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
jpaProperties.setProperty("hibernate.hbm2ddl.auto", "validate");
emf.setJpaProperties(jpaProperties);
emf.setPackagesToScan("com.test.model.logic", "com.test.jpa");
emf.setMappingResources("Setting.hbm.xml");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform("HSQL");
emf.setJpaVendorAdapter(adapter);
emf.afterPropertiesSet();
isValid = true;
} catch (Exception ex) {
isValid = false;
} finally {
emf = null;
}
return isValid;
}
必要に応じてさらに情報を提供させていただきます。ありがとう!