クラスを @MappedSuperclass として宣言する方法はありますか?たとえば、共通のプロパティを継承し、同時にそのクラスを他のクラスのオブジェクト プロパティとして参照できるようにする方法はありますか?
もう少し背景情報:
すべての拡張クラスが持つべきいくつかのプロパティを持つクラスがあります。たとえば、
class Resource {
String id;
String description;
String value;
}
これは @MappedSuperclass の使用例です。すべての拡張クラス/タイプは、そのクラスから継承されます。
しかし、私は他のクラスも持っています。
@Entity
class MyList extends Resource {
Resource firstElement;
MyList otherElements;
}
ここでは、firstElement
Resource は @Entity ではないため、Resource 型のオブジェクト プロパティを使用することはできません。
これは可能ですか?何をすることをお勧めしますか?
この文脈で私が考えたいくつかのこと:
- JOINED 継承を使用したいと考えています。これにより、データベース レベルで非常に優れたクリーンなスキーマを作成できるからです。クラスとサブクラスごとに 1 つのテーブルがあり、適切な外部キー参照があります。もちろん、ここでの欠点は、オブジェクトをクエリするときに結合が増えることですが、それは問題ありません。
- TABLE_PER_CLASS 継承を使用したくありません。データ モデル クラスが多数あり、クラス レベルの階層が平均 3 であるためです。TABLE_PER_CLASS を使用すると、データベース テーブルに膨大な数の列が含まれることになります。
- @Entity
Resource
にしてデータベースにクエリを実行するとResource.value
、膨大な量のテーブルが結合されるとします。私のデータ モデルでは、約 50 ~ 60 個のテーブルがあります。
このような設計上の問題に遭遇したことがありますか? クリーンなデータベース設計とパフォーマンスのバランスをどのように取りましたか? 多くの人が TABLE_PER_CLASS 継承階層を推奨しています (まだ試していません) が、すべてのクラスのすべてのプロパティを 1 つのテーブルにまとめることは想像できません...