EntityManagerFactory
私の Web フレームワーク (Play 1.2.5) は、 (source)の作成に使用するメソッドに対してローカルな EJB3Configuration を作成します。私はスクリプトに取り組んでおり、generateSchemaUpdateScript()
Configuration からメソッドを実行して、本番デプロイで検証および実行できる SQL スクリプトを作成したいと考えています。私が抱えている問題は、使用された Configuration オブジェクトにアクセスする方法や、EntityManagerFactory
ビルド後に Configuration オブジェクトを生成する方法がわからないことです。
2 に答える
休止状態の実装 EntityManagerFactoryImpl が構成オブジェクトへの参照を保持していないため、entitymanagerfactory から構成オブジェクトを取得できません。
あなたの選択肢は
- スクリプトで JPAPlugin のコードを複製して、独自の構成オブジェクトを作成します
- クラスで動作するように休止状態ツールを構成します。私はこのツールを自分で使用したことはありませんが、適切に構成されていれば、彼は ddl を生成できると思います
- データベースから ddl スクリプトを生成します
エンティティ マネージャー ファクトリが作成されると、Configuration オブジェクトへのハンドルを持つことは想定されていません。これは、Configuration がそのプロパティを変更できないという点で不変の動作を示すことが想定されている設計が原因の 1 つです。
私はHibernate 3.6.8ソースを参照しており、EJB3Configurationクラスにはメソッドがあります
public AnnotationConfiguration getHibernateConfiguration() {
//TODO make it really read only (maybe through proxying)
return cfg;
}
AnnotationConfiguration は、そのすべての機能が Configuration クラスに移動されたため、非推奨として宣言されています。
したがって、これを使用すると、作成された構成のハンドルを取得できると思います。その構成で何も変更しないように注意する必要があります。
#buildEntityManagerFactory() が呼び出された後は、構成の状態を変更できなくなります (クラスの追加やプロパティの変更などはありません)。
そうは言っても、あなたが達成しようとしていることは、特に本番データベースでは絶対にお勧めできません。こちらをご覧ください
Hibernate には、「hibernate.hbm2ddl.auto」という名前のプロパティがあり、スクリプトが進化する場合にスキーマの自動生成を支援します。プログラムで達成しようとしていることは、持続性 xml で以下のようにupdateの値を与えるのと同じ効果があります。実際、「hibernate.hbm2ddl.auto」の値が「update」に設定されている場合、内部では、generateSchemaUpdateScript メソッドが構成によって呼び出されます。
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="xyz" transaction-type="RESOURCE_LOCAL">
<properties>
....................
<property name="hibernate.hbm2ddl.auto" value="update"/>
......................
</properties>
</persistence-unit>
</persistence>
ここで、この属性の他の可能な値を参照できます
ただし、Hibernate のドキュメントでは、本番データベースに対してこれを使用しないように厳密にアドバイスしています。
Hibernate に関する決定版の本「Java persistence with Hibernate」は、このことを警告しています。
警告Hibernate ユーザーが SchemaUpdate を使用して本番データベースのスキーマを自動的に更新しようとしているのを見てきました。これはすぐに惨事に終わる可能性があり、DBA によって許可されません。
また、スキーマの更新プロセスに関するいくつかの制限もあります
この構成プロパティの追加オプションである update は、開発中に役立ちます。組み込みの SchemaUpdate ツールが有効になり、スキーマの進化が容易になります。有効にすると、Hibernate は起動時に JDBC データベースのメタデータを読み取り、古いスキーマを現在のマッピング メタデータと比較して新しいテーブルと制約を作成します。この機能は、JDBC ドライバーによって提供されるメタデータの品質に依存することに注意してください。これは、多くのドライバーが不足している領域です。したがって、実際には、この機能は思ったほど刺激的でも有用でもありません。
更新 1: EJB3Configuration へのアクセス権がなく、最終的な目的が JPA アノテーション付きエンティティの更新スキーマ スクリプトを作成することである場合は、設定の詳細を含む永続化 xml ファイルを使用して、プログラムで Java メイン クラスに EJB3Configuration を作成できます。データベースを開き、スキーマ エクスポート ツールを実行します。この例を参照してください。このようにして、フレームワークやコンテナーの外部にある JPA エンティティでツールを実行できます。
更新 2
ここにリストされているコード例は、play アプリケーションのデータベース移行を作成するときに Hibernate スキーマ更新を使用する方法を示しています。これはあなたが欲しかったもののようです!