2011-12-27 9 views
5

データベースに新しいテーブルを追加する機能を追加するmysqlデータベースがあります。おそらく簡単にJPQLの例を見つけることができますが、この新しいテーブルのエンティティを自動的に生成して、JPAコードの残りの部分でそれを参照して、通常はエンティティを参照するテーブルから更新および削除することができます実際のテーブル自体ではありません。データベースに新しいテーブル/エンティティを追加するJava EE/JPAの方法

私が今作成したエンティティ私が作成したテーブルから生成するためにeclipeを使用しました。しかし、デプロイメントの後、明らかにEclipseにはこれが行われないので、テーブルが作成されるたびに自動的に実行する必要があります。

答えて

7

新しいテーブルを動的に作成およびマッピングすることは、JPAがサポートするものではありません。その場で新しいJavaクラスを作成し、マッピングメタデータを動的に更新する必要があります。 JDBCまたはネイティブ・クエリーを使用して、必要なすべてを実行できます。しかし、その場で新しいテーブルを作成する必要がある理由を説明してください。

+0

テーブルを頻繁に作成する必要があることはわかりません。スキーマを正しく作成すると、新しいテーブルを作成する必要があります。しかし、私たちがやったのであれば、サーバープロジェクトを再構築し、新しいマッピングで展開することができます。私はそれが可能かどうかを知りたがっていました。 – Randnum

+0

新しいマッピングを追加するには、実際には新しいバージョンのアプリケーションを再デプロイする必要があります。この新しいテーブルが既存のテーブル(新しい外部キー、設計変更など)に影響する可能性が高いため、スキーマ移行スクリプトを実行する必要があります。プロダクションサーバーで実行する前に、手順全体をテストして、停止時間をできるだけ短くするようにしてください。 –

+0

良い点。少なくとも、私にもたらされた質問については、これらのテーブルは、関係やキーがない他のテーブルとは独立していると思います。しかし、エンティティを生成するためには再配置する必要があります。それでもやはり悪い考えです。 – Randnum

1

サーバの起動時にデータベースを更新するために、hibernateのプロパティまたはpersistence.xmlを設定できます。自動的にテーブルの更新を行います。 は、hibernateDialectパラメータの横に表示されます。

<property name="hibernate.hbm2ddl.auto" value="update" /> 

です。 エンザベルクラスを素早く作成したいと思うのではなく、@ JBのように再デプロイせずにテーブルを作成したいとNizetは答えています。

3

テーブルを作成するには、いくつかの方法があります。本番用の最も一般的な使用法は、DBA(またはその役割の開発者)がアプリケーションとは独立してデータベース・スキーマ(表など)を作成することです。

これは典型的なことです。アプリケーションはデータベース内のデータをモデル化するため、データベースは通常、アプリケーションよりも寿命が長いという一般的な知恵があります。

JPAプロバイダに自動的にスキーマを作成させることは可能です。特に、この目的のためにJPAアノテーションにいくつかの属性があります(例えばnullable属性JoinColumn)。

これを有効にするには、persistence.xmlのプロバイダ固有のプロパティを使用します。例えば。 (JBoss ASで使用される)Hibernateの場合はhibernate.hbm2ddl.auto、GlassFishの場合はEclipseLinkの場合はeclipselink.ddl-generationです。

いくつかの例ではhttp://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/JBossを参照してください。

テーブルにエンティティを挿入することはまったく異なることです。あなたの質問から、どういうわけか、それらの2つの違いを完全に理解していないかもしれないという気持ちが出ます。例えば、 EntityManager#persistですが、私が100%確信しているわけではありません。

関連する問題