SINGLE_TABLE
レガシー データベースをマッピングしています。そのうちの 1 つのテーブルは、識別子列を使用したマッピングを使用して継承階層に自然にマップされます。問題は、膨大な数の識別子の値があることです! (また、新しいものが時々追加され、アプリはポリモーフィック クエリでそれらを自動的に取得する必要があります)。私のアプリの観点からは、これらの異なる型の大部分を同じように扱いたいと思います (つまり、継承階層の基本クラスにマップするだけです)。ただし、一部については、特定のサブクラスにマップしたいと考えています。問題は、JPA が@DiscriminatorValue
基本クラスに固有のものを 1 つ提供することを要求しているように見えることです (そうでなければ、デフォルトのものを生成します)。
具体的には:
@Entity
@Table("products")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "product_type")
@DiscriminatorValue( *anything not specified elsewhere!* )
public class Product {
...
public double calculateMarkup() { ... default impl ... }
}
@Entity
@DiscriminatorValue("ProductA")
public class ProductA extends Product {
...
@Override public double calculateMarkup() { ... specific impl ... }
}
これを JPA (または Hibernate 3.3 固有の拡張機能) でエレガントにマップする方法はありますか? 私ができる唯一の解決策は、継承を放棄し、特別な場合にその値を内部的に切り替える通常のフィールドとして列をマップすることですが、それは不自然で少し汚いと感じます。