私のプロジェクトでは、データベースに JPA/Hibernate スタックをよく使用します。
定義するときpersistence.xml
、設定できるいくつかのオプションがありますhibernate.hbm2ddl.auto
。テーブルに設定するcreate
と、アプリケーションが実行されるたびに再作成されます (保持されたデータはもちろん失われます)。でdbフィクスチャを設定することで、初期データをインポートすることも可能hibernate.hbm2ddl.import_files
です。テーブルのみに設定するとupdate
、新しいエンティティが作成されます (既存のテーブルに保持されたデータは保持されます)。
問題は、これは開発中にそれほど便利ではなく、次のような動作が欲しいということです:
- 最初のアプリケーション実行時 (データベースにテーブルがない場合) -が(エンティティに基づいてテーブルを作成する) に
hibernate.hbm2ddl.auto
設定されているように動作し、事前定義されたデータベース フィクスチャをインポートします。create
- 後続のすべての実行で -
hibernate.hbm2ddl.auto
が設定されているように動作しupdate
ます (新しいエンティティの新しいテーブルを作成し、古いエンティティのテーブル/データを残します)。
これはこのようなものを実装することは可能ですか?
私の典型的なスタックの詳細: Tomcat で実行されている Spring Web アプリケーション、データベースは MySql、データベース アクセス用の JPA/Hibernate です。
私の典型的なpersistence.xml
:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
<property name="hibernate.hbm2ddl.import_files" value="/META-INF/spring/import.sql"/>
</properties>
</persistence-unit>
</persistence>
私のアプリケーション構成/構造に関する他の情報が必要な場合は、コメントしてください。