web-dev-qa-db-ja.com

実行時にエンティティのテーブル名を変更しますか?

毎月生成されるこのテーブルがあります。基本的に、すべてのmonthlyテーブルのテーブル構造は同じです。

同じエンティティを異なるテーブル名でマップするのは大変な作業になるため、

エンティティが結局同じテーブル構造を持っているので、実行時にエンティティのテーブル名を次のように変更することは可能ですか?

   @Entity
   @Table(name="FOO_JAN2010") // any other ways to generate this dynamically?
   public class FooJan2010Table {  // if we can dynamically set the table name this can be simply named FooTable
       ...
   }

そうでない場合、どのようなアプローチを提案できますか?

20
Joopiter

エンティティは結局同じテーブル構造を持っているので、実行時にエンティティのテーブル名を次のように変更することは可能ですか?

これは実際には不可能です。少なくとも、次のような質問で述べられているように、標準のJPA(非標準のJPAで実行したという意味ではありません)では不可能です。

要約すると、JPAは、すでに初期化されている永続性ユニット(および関連する事前コンパイルされたCRUDクエリ、事前コンパイルされた名前付きクエリなど)の特定のエンティティを「変更」する方法を提供していません。

それでも、Hibernateを使用しているので、おそらく http://www.hibernate.org/171.html を見て、Hibernate CoreAPIを使用して何が可能になるかを理解してください。

私が考えることができる別のオプションは、データベースsynonym/aliasFOOは、エイリアスをFOO_JAN2010を指すように変更するまで、FOO_FEB2010のエイリアスになります。私はこれをテストしたことがありません、それがあなたのニーズに合うかどうかはわかりません。しかし、それは別の考えです。

7
Pascal Thivent

HibernateをJPAプロバイダーとして使用している場合、canはおそらく Naming Strategies を使用して実行できます。参考のために この前の質問に対する私の答え を参照してください。

動的な方法でテーブル名を返すように命名戦略を設計できるはずです。

ただし、すべきかそのようにするかどうかという質問はまったく異なります。

また、Pascalに思い出させてくれてありがとう、これはEntityManagerFactoryが月に1回再作成された場合にのみ機能します(これを行う方法はたくさんあり、最も簡単なのはWebアプリの再起動です)

5

私もこれを理解できず、同様の要件がありました。

テーブル名が比較的頻繁に(毎日)変更されないため、RDBMS(DB2を使用)で「アクティブ」テーブルにDBエイリアスを定義し、@ Tableアノテーションでテーブルエイリアス名を参照することになりました。

これは厳密にはOPが求めたものではないことを十分に認識していますが、経験を共有したいと思いました。

1
Denilson

これをマッピングする良い方法は想像できません。これがレガシーデータベースの場合、JPAを使用してデータベースにアクセスするのは困難です。

ただし、データベースレイアウトが管理下にある場合は、変更します。まったく同じレイアウトの複数のテーブルを用意することは、通常、悪い設計です。年と月に追加の列を持つテーブルを1つだけ持つことで、同じ結果を得ることができます。 2つの列にインデックスを付けることを忘れないでください。

1
Henning