Hibernate での抽象マッピングに関するトピックはたくさんありますが、私のケースに一致するものは見つかりませんでした。
問題:
私のドメイン モデルは、互いに継承しない複数のエンティティで構成されています。例えば:
- 従業員
- グループ
- デパートメント
- 報告
どこ:
従業員 <-> グループ (n:m)、従業員 -> 部署 (n:1)
この程度なら問題ありません。しかし:
レポートを従業員、グループ、または部門 (1:1) のいずれかにマップできるようにしたいと考えています。(レポートは他の多くの異なるエンティティにマップ可能であるため、例は単純化されています)。さまざまな外部がデータベースに接続する必要があり、他のエンティティの一般的なテーブル構造に関してモデルを変更しないため、すべてのエンティティは独自のテーブルに存在する必要があります。
私が試したこと
クラスごとのテーブルで Hibernate Inheritance 戦略を使用してみましたが、ユーザー、従業員、部門は新しいAbstractEntityからサブクラス化され、親クラスの ID と Name プロパティを共有しています。したがって、ユーザー、従業員、部門にはまだ独自のテーブルがあります。Report <-> AbstractEntityをマップできるようになり、これが機能します。しかし、 Hibernateは内部的にすべてのサブクラス テーブルで大量の結合を行う必要があるため、約 20 以上のレポートがある場合は、予想どおり、これにより重大なパフォーマンスの問題が発生します。
テーブル構造が変更されたため、階層ごとに単一のテーブルはオプションではありません (問題を参照)。さらに、すべてのエンティティは ID と名前のみを共通のプロパティとして共有します。
考えられる解決策
考えられる解決策の 1 つは、自分でマッピングを実装することです。つまり、ID とエンティティ クラスを Report に格納します。AbstractEntity のゲッターは、保存された値に基づいて、どのテーブルからロードして正しいエンティティを返すかを決定できるようになりました。
しかし: ここでの問題は、セッションがレポート クラスに認識されていないため、エンティティ クラスでセッションを行うことができないことです。また、これはロジックとモデル層を混同します。
回避策は、DAO にある種のラッパーを記述することです。これにより、正しいエンティティがデータベースからロードされ、結果に挿入されます。ただし、すべての DAO メソッドをオーバーライドする必要があるため、これは非常にエラーが発生しやすくなります。
質問
だから私の質問は次のとおりです。データベースからのレポートエンティティの取得を何らかの方法でキャッチまたは傍受し、そこに正しいAbstractEntityのロードを挿入する方法はありますか?
または、私が望むことを行うための別のよりエレガントな方法がありますか (;))?
http://community.jboss.org/wiki/GenericDataAccessObjectsのように、DAO を使用する Java EE 環境で EntityManager を使用せずにアノテーションを使用して Hibernate 3.6 を使用しています。