2

既存のレガシー コードとプロセスに関連するさまざまな理由から、Hibernate を使用して、単一のエンティティ クラスを同じ構造の異なるテーブルにマップできるようにしたいと考えています。テーブルは、別の既知のテーブルから実行時に動的に作成されます。たとえば、次のクラスがあります。

public class Item {

   private int id;
   private String label;
    ...
}

これは、3 つの異なるテーブルにマップされ、ITEM1すべて同じ構造を持っています。ITEM2ITEM3

 CREATE TABLE ITEM[1|2|3] (
    NUMBER id PRIMARY KEY,
    VARCHAR label NOT NULL)

前述のように、外部構成/条件に従って、実行時にテーブルが作成されます。

SOに関する次の質問を確認しました。

提案された解決策(サブクラス化)は可能ですが、実際には魅力的ではありません。これは、実行時に動的なクラスを作成する黒魔術を暗示しており、できれば避けたいと思います。

thisおよびthisブログ投稿から、同じエンティティを複数のテーブルにマップする動的な Hibernate マッピングを作成できると思います。

このような動的マッピングを実装した経験のある人はいますか?

4

1 に答える 1

4

重要な場合、私はあなたが言及したブログ投稿の著者です。

あなたの質問を2つに分解しましょう:

  1. サブクラス化せずに同じクラスを複数のテーブルにマップすることは可能ですか?
  2. 新しいテーブルに対応するために実行時にマッピングを調整することは可能ですか?

1. に対する答えは、はい、アノテーション ベースのマッピングを使用せず、同じクラスを異なるエンティティ名でマッピングする場合です。投稿した 2 番目のリンク ( hibernate/jpa アノテーションを使用して 1 つのクラスを別のテーブルにマップする方法) は、その解決策を示唆しています。HBM ファイルを使用するか、もちろんプログラムによる構成を使用して実行できます。追加の引数としてエンティティ名を指定できる、より冗長な save()、update() などのオーバーロードを使用する必要があります。

2. の答えは、はい、いいえです。( Portofinoで行うように) 古いものと一緒に新しいマッピングを使用してまったく新しい SessionFactory を再構築できますが、既存の SessionFactory に新しいマッピングをプログラムで追加することはできません。つまり、ある時点で既存のすべてのセッションを閉じ、古い SessionFactory を破棄し、新しいセッションを構築して使用を開始する必要があります。つまり、はい、実行時に実行できますが、同じセッション ファクトリの他の用途とシームレスかつ同時に実行することはできません。もちろん、複数の SessionFactories を使用してマッピングを分割したり、冗長なマッピングを提供したり、適切な更新スキームを処理したりできます。それは本当にあなたの要件に依存します。

于 2013-10-31T10:56:07.530 に答える