我的域模型中有不同的表/实体具有相同的字段(UUID).有一个表,我需要将这些实体的行/实例链接到其他JPA管理的实体.换句话说,该链接表中的字段的实例将不会在前面被知道.我可以想到的两种方法是:
>使用抽象实体和TABLE_PER_CLASS策略,或
>使用@MappedSuperClass在链接表中存储实例的类名,或类似的东西,可以让我定义从正确的表获取实际实例的逻辑.
两者在复杂性和性能方面都有优缺点.你认为最好的是,可能有第三个选择,或者你以前曾经尝试过这样的事情,并提出建议/强烈警告?
长版本,如果你想要更多的背景:
我有一个@R_301_457@/对象模型,其中许多类型具有公共字段:普遍唯一的标识符(UUID).原因是这些类型的实例可能会发生变化.这些更改遵循命令模型,它们的数据可以被封装,并且本身也保持不变.让我们把这个改变叫做“突变”.必须有可能发现@R_301_457@中哪些突变存在于任何给定的实体中,反之亦然,在哪个实体上存储的突变进行操作.
要存储“突变”,我们使用一个名为MutationHolder的表/实体.要将突变链接到其目标实体,有一个MutationEntityLink.这个数据不直接在MutationHolder上的唯一原因是因为可以有直接或间接的链接,但这在这里并不重要,所以我留下来:
问题归结为如何在MutationEntityLink中建模实体字段.我可以想到两种方法.
第一个是使用UUID字段创建一个抽象的@Entity注释类.客户,合同和地址将会延长.所以这是一个TABLE_PER_CLASS策略.我假设我可以使用它作为实体字段的类型,尽管我不确定.但是,由于JPA需要查询许多表才能找到实际的实例,我可能会遇到严重的性能损失.
第二个是简单地使用@MappedSuperClass,并将实体的UUID存储在MutationEntityLink的实体字段中.为了获得具有该UUID的实体,我必须以编程方式解决它.使用实体的类名添加附加列,或者允许我识别它或将其粘贴到JPQL查询中的其他列.这需要更多的工作,但似乎更有效率.我不反对编码一些实用程序类或做一些反射/自定义注释工作,如果需要的话.
我的问题是哪些方法似乎最好?或者,你可能有一个更好的建议,或通知我错过了一些东西;例如,也许有一种方法可以使用TABLE_PER_CLASS继承来添加类型列,以将JPA指向正确的表格?也许你已经尝试了这样的事情,并且想要警告我会出现许多问题.
一些额外的信息:
>我们创建@R_301_457@模式,所以我们可以添加任何我们想要的.
>单表继承策略不是一个选择.表必须保持不变.出于同样的原因,加入继承似乎也不是很好的适合.
> JPA提供程序是Hibernate,并且使用不属于JPA标准的东西不是问题.