2

私のプロジェクトでは、データベースに 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>

私のアプリケーション構成/構造に関する他の情報が必要な場合は、コメントしてください。

4

3 に答える 3

3

hbm2ddl.autoを使用すると、データベースの値ではなく、データベースの構造のみを更新できることに注意してください。

例:あなたが持っているとしましょう

@Version
private Long version;

しばらくすると、

@Version
@Temporal(TemporalType.TIMESTAMP)
private Date lastModified;

Hibernate はセマンティックな意味の変化について多くの手がかりを持っておらず、それに応じてフィールドを変換する方法や、どのデフォルトを設定するかを確実に知りません。

プロパティhbm2ddl.autoとプロパティhbm2ddl.import_filesは、短期間の (インメモリ) データベース (したがって、自動化された統合または受け入れテスト) には便利ですが、運用環境にはまったく適していません。

scriptellaliquibaseのようなものを強くお勧めします 。個人的には後者を使っています。Nathan はこのツールで素晴らしい仕事をしていますが、ドキュメントには詳細が少し欠けています。

そうは言っても:

-Dhibernate.hbm2ddl.auto=create -Dhibernate.hbm2ddl.import_files=foo.sql

アプリの最初の起動時にトリックを行う必要があります。の値を に設定するhbm2ddl.autoだけupdateですpersistence.xml

于 2014-03-22T00:47:22.620 に答える
1

同じ問題があり、Hibernate/JPA ソリューションが見つかりませんでした。Hibernate ソリューションがないオプションはありますか? liquibaseを使用することをお勧めします。いくつかの初期 SQL を定義すると、liquibase が起動時にそれらを実行します。Maven プラグインがあるため、pom で構成してから maven で使用できます。

于 2013-10-24T11:00:41.423 に答える