18

インメモリ HSQL データベースで実行されるいくつかの統合テストを含む Spring/Hibernate webapp があります。Hibernate はこの空のデータベースを取得し、hbm2ddl=create のおかげですべてのテスト テーブルと制約を作成します。ただし、 afterPropertiesSet() メソッド中にデータベースから特定の構成値をチェックする新しい Bean があるため、この Bean が初期化されるときに、そのような行がデータベースに存在する必要があります。

Railのテストフィクスチャに相当するJava/Spring/Hibernateをセットアップする良い方法はありますか? 「このテーブルを作成するときはいつでも、これらの行をすぐに挿入してください」とHibernateに伝える方法を見つけようとしています。追加できるコールバックやフックが見つかりませんでしたが、別の方法があるかもしれません。

4

3 に答える 3

29

私はHibernateに「このテーブルを作成するときはいつでも、すぐ後にこれらの行を挿入する」ように伝える方法を見つけようとしています。

Hibernate 3.1以降、Hibernateのランタイムクラスパスで呼び出されるファイルを含めることができ、import.sqlスキーマのエクスポート時に、Hibernateはスキーマがエクスポートされた後にそのファイルに含まれるSQLステートメントを実行します。

この機能は、ロッテルダムJBugとHibernateのimport.sqlブログ投稿で発表されています。

import.sql:単体テストでデータを簡単にインポートします

Hibernateには、文書化が大幅に不足していて不明な、きちんとした小さな機能があります。SessionFactoryデータベーススキーマ生成直後の作成中にSQLスクリプトを実行して、新しいデータベースにデータをインポートできます。import.sqlクラスパスルートで名前が付けられたファイルを追加し、createまたは プロパティcreate-dropとして 設定する必要がありhibernate.hbm2ddl.autoます。

クエリの章を開始したので、Hibernate SearchinActionに使用します。単体テスト用の新しいデータセットでデータベースを初期化します。JBoss Seamは、さまざまな例でもこれを頻繁に使用します。 import.sql非常にシンプルな機能ですが、非常に便利です。SQLはデータベースに依存している可能性があることに注意してください(移植性があります!)。

#import.sql file
delete from PRODUCTS
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair blah blah...');
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('2', 'B00003CXCD', 'Roman Holiday ', 12.98, 'B00003CXCD.jpg', 'We could argue that blah blah');

この機能の詳細については、Eyalのブログを確認してください。彼はそれについてのちょっとしたエントリを書いています。データベースオブジェクト(インデックス、テーブルなど)を追加する場合は、補助データベースオブジェクト機能を使用することもできます。

それはまだ実際には文書化されていません。

于 2010-08-04T19:47:36.620 に答える
6

hibernate 3.6 では、任意の sql コマンドを実行できる構成は次のとおりです。

hibernate.hbm2ddl.import_files

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/を参照してください。ドキュメントにエラーがあることに注意してください: プロパティは import_files で、末尾に s があります。

于 2011-04-14T11:31:04.410 に答える
1

If you're talking about JUnit tests and using AbstractTransactionalDataSourceSpringContextTests there's methods you can override like onSetupBeforeTransaction that provide a hook to pre-populate test table data etc.

于 2010-08-04T19:26:05.800 に答える