假设我有以下类层次结构:
interface Client:
String name
String country
class RegisteredClient implements Client:
String assignedId
class UnregisteredClient implements Client
class ClientRisk:
Client client
int riskLevel
这个想法是ClientRisk
可以链接到具有 id 的注册客户端(这是自定义的并且来自其他地方),或者一些自定义客户端(未注册)。现在存在以下数据库结构:
REGISTERED_CLIENT(ASSIGNED_ID, NAME, COUNTRY)
CLIENT_RISK(REG_CLIENT_ID, UNREG_NAME, UNREG_COUNTRY, RISK_LEVEL)
我用 Hibernate 映射了这些实体,例如在 中有两个隐藏字段ClientRisk
,一个是引用RegisteredClient
,另一个UnregisteredClient
是映射为组件。我添加了一个属性client
,在运行时区分这两个字段。
这是一种丑陋的解决方案,并且无法扩展(例如,我不能只写client.name
标准或 HQL)。另一方面,我不想将未注册的客户放到另一个表中,因为它是自定义的,无论如何都不会共享。我也不想映射UnregisteredClient
为基于CLIENT_RISK
表的实体,这会导致不必要的连接(CLIENT_RISK JOIN CLIENT_RISK
)。
我的问题是,在 Hibernate 中处理这种情况的最佳方法是什么?