次のクラス階層があるとします。
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 でこのような状況を処理する最善の方法は何ですか?