次のクラス階層があるとします。
interface Client:
String name
String country
class RegisteredClient implements Client:
String assignedId
class UnregisteredClient implements Client
class ClientRisk:
Client client
int riskLevel
アイデアはClientRisk
、IDを持つ登録済みクライアント(カスタムであり、他の場所から取得されたもの)またはカスタムクライアント(登録されていない)へのリンクを持つことができるということです。現在、次の DB 構造が存在します。
REGISTERED_CLIENT(ASSIGNED_ID, NAME, COUNTRY)
CLIENT_RISK(REG_CLIENT_ID, UNREG_NAME, UNREG_COUNTRY, RISK_LEVEL)
このエンティティを Hibernate にマップしました。たとえば、 に 2 つの隠しフィールドがありClientRisk
、1 つは参照RegisteredClient
しており、もう 1 つUnregisteredClient
はコンポーネントとしてマップされています。そしてclient
、実行時にこれら 2 つのフィールドを区別するプロパティを追加しました。
これは一種の醜い解決策であり、拡張性がありません (client.name
たとえば、基準や HQL だけを記述することはできません)。一方、未登録のクライアントを別のテーブルに入れたくありません。それは、カスタムであり、とにかく共有されていないためです。UnregisteredClient
テーブルに基づいたエンティティとしてマップしたくありません。CLIENT_RISK
これにより、不要な結合が発生します ( CLIENT_RISK JOIN CLIENT_RISK
)。
私の質問は、Hibernate でこのような状況を処理する最善の方法は何ですか?