web-dev-qa-db-ja.com

Hibernateでデータベースに初期データをインポートする方法は?

アプリケーションをデプロイするとき、デプロイメントを簡素化するためにHibernateの能力を使用してデータベーススキーマを作成することがよくあります。これは、hibernate.hbm2ddl.autoプロパティを設定することで簡単に達成できます。

ただし、場合によっては、rootユーザーなどの初期データをデータベースに挿入する必要もあります。何らかの種類のテキストファイルを読み込み、休止状態でこれを実現する方法はありますか?

そうするコードを簡単にプログラムできることは知っていますが、同じビア設定を実現するのに役立つユーティリティが既にあるのではないかと思っていますか?

62
Dan

「Hibernateフィクスチャ」を検索して、これを見つけました。

Hibernateは、エンティティマネージャーファクトリが作成されると(実際には、HibernateのSessionFactoryがエンティティマネージャーファクトリによって作成されると)データベースを作成します。 import.sqlという名前のファイルがクラスパスのルート( '/import.sql')に存在する場合、Hibernateはデータベーススキーマの作成後にファイルから読み取られたSQLステートメントを実行します。 Hibernateはスキーマを作成する前に空にします(スキーマの構築プロセスで作成されるすべてのテーブル、制約、またはその他のデータベースオブジェクトを削除します)。

ソース: http://www.velocityreviews.com/forums/t667849-hibernate-quotfixturesquot-or-database-population.html

試してみて、機能するかどうかをお知らせください!

82
Matt Sidesinger

Import.sqlをクラスパスに追加すると、hbm2ddlがファイルが存在するかどうかを確認して実行します。唯一の追加の詳細は、各sqlコマンドが独自の行にある必要があることです。そうしないと、実行に失敗します。

これは、hbm2ddl.autocreateまたはcreate-dropに設定されている場合にのみ機能します。

60
Mauro De Lucca

Hibernate設定にhibernateプロパティ hibernate.hbm2ddl.import_files を追加します。 hibernate.hbm2ddl.autoプロパティを作成するように変更します。/classesディレクトリにinitial_data.sqlを追加し、データを挿入する初期SQLコードを追加します。 Hibernateは、データベーススキーマの作成後にこれを実行します。

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.hbm2ddl.import_files">initial_data.sql</prop>
        </props>
    </property>
</bean>

Hibernate構成にプロパティを追加したくない場合、/ classesディレクトリにファイルimport.sqlを作成し、プロパティhibernate.hbm2ddl.autoがcreateと等しい場合、デフォルトでhibernateがこれを使用できます。

42
punseti

なぜ hbm2ddl.autoおよびhbm2ddl.import_filesプロパティはevil

(データベース変更管理のツールとして誤用された場合)

前述のように elsewhere 、使用hibernate.hbm2ddl.autoおよびhibernate.hbm2ddl.import_filesデータベース変更管理には、いくつかの重大な欠点があります。

  1. 変更できるのは構造のみです。既存の値は上書きされるか、最悪の場合は単純にNirvanaに送信されます。 liquibase または scriptella のようなツールがなければ、 [〜#〜] etl [〜#〜] 機能はありません。
  2. このメソッドにはトランザクションがありません。トランザクションマネージャーが引き継ぐ前に、構造とデータステートメントの両方が実行されます。 256のステートメント42にエラーがあるとしましょう。データベースは現在、一貫性のない状態です。
  3. Imvho、あなたは透明性と制御を失います:scriptellaスクリプトまたはliquibaseの変更セットまたは通常はドメインモデルの変更と一緒にコミットする場合、ドメインモデルを変更し、(基本的に)休止状態が何をすべきかを見つけることを望みます。 (そうではありませんが、それは別の話です。)
  4. 統合、システム、および受け入れテストでは、テストデータベースが絶対に、実稼働データベースとまったく同じ状態であることを仮定する 。手動で追跡する必要があります(幸運をお祈りします!;))。あなたがエラーを犯した場合、ほんの少しのスリップで十分であり、結果は非常に壊滅的なものになるでしょう。

私は個人的にデータベース変更管理にliquibaseを使用し、メンテナンス作業を削減するために次のワークフローを開発しました。

customChange を実装しなければならない複雑な変更であっても、ロールバックの定義、テスト、文書化など、数時間で達成できます。些細な変更の場合、数分です。基本的に、もう少し作業を行う必要があります(1日以内に4つのデータベース構成用にカスタマイズされた変更セットを作成しました)が、データベースを一貫した状態に保つために可能な限りのことをすべて行ったことに安心します。

21

これに数時間つまずいた後、私は見つけたものを共有することにしましたが、それは非常に古い投稿です。

適切に動作させるには、次のことをしなければなりませんでした。

  • hbmddlcreateまたはcreate-dropに設定されます
  • クラスパスルートのfile.sql。私の場合、resourcesフォルダーに入れるだけで、mavenを使用しています。
  • 各SQLコマンドを1行で
  • 各file.sqlはファイルの先頭に空白行が必要です ==>この理由はわかりませんが、その空白行を挿入しないと、サーバーを実行すると、最初の文字の近くに構文エラーがあることがわかります。

お役に立てば幸いです。

7
jomar

Import.sqlが正しくフォーマットされていることを確認してください。テストする1ライナー挿入ステートメントから始めます。

0
Ninja420