java – 在JPA中链接不同实体类型的最佳方法
匆忙的简短版本:
我的域模型中有不同的表/实体具有相同的字段(UUID).有一个表,我需要将这些实体的行/实例链接到其他JPA管理的实体.换句话说,该链接表中的字段的实例将不会在前面被知道.我可以想到的两种方法是: >使用抽象实体和TABLE_PER_CLASS策略,或 两者在复杂性和性能方面都有优缺点.你认为最好的是,可能有第三个选择,或者你以前曾经尝试过这样的事情,并提出建议/强烈警告? 长版本,如果你想要更多的背景: 我有一个数据库/对象模型,其中许多类型具有公共字段:普遍唯一的标识符(UUID).原因是这些类型的实例可能会发生变化.这些更改遵循命令模型,它们的数据可以被封装,并且本身也保持不变.让我们把这个改变叫做“突变”.必须有可能发现数据库中哪些突变存在于任何给定的实体中,反之亦然,在哪个实体上存储的突变进行操作. 使用UUID作为一个(非常简化)的例子: 要存储“突变”,我们使用一个名为MutationHolder的表/实体.要将突变链接到其目标实体,有一个MutationEntityLink.这个数据不直接在MutationHolder上的唯一原因是因为可以有直接或间接的链接,但这在这里并不重要,所以我留下来: 问题归结为如何在MutationEntityLink中建模实体字段.我可以想到两种方法. 第一个是使用UUID字段创建一个抽象的@Entity注释类.客户,合同和地址将会延长.所以这是一个TABLE_PER_CLASS策略.我假设我可以使用它作为实体字段的类型,尽管我不确定.但是,由于JPA需要查询许多表才能找到实际的实例,我可能会遇到严重的性能损失. 第二个是简单地使用@MappedSuperClass,并将实体的UUID存储在MutationEntityLink的实体字段中.为了获得具有该UUID的实体,我必须以编程方式解决它.使用实体的类名添加附加列,或者允许我识别它或将其粘贴到JPQL查询中的其他列.这需要更多的工作,但似乎更有效率.我不反对编码一些实用程序类或做一些反射/自定义注释工作,如果需要的话. 我的问题是哪些方法似乎最好?或者,你可能有一个更好的建议,或通知我错过了一些东西;例如,也许有一种方法可以使用TABLE_PER_CLASS继承来添加类型列,以将JPA指向正确的表格?也许你已经尝试了这样的事情,并且想要警告我会出现许多问题. 一些额外的信息: >我们创建数据库模式,所以我们可以添加任何我们想要的. 解决方法
如果实体没有任何共同之处,除了有一个uuid我会使用你描述的第二种方法:使用MappedSuperclass.使共同的超类成为一个实体将阻止您在需要时使用不同的继承策略,即使没有实例存在,并且从业务角度来看,它也需要一个超级实体的表.
链路本身可以以多种方式实现,例如您可以为每个实体子类化MutationEntityLink(例如CustomerMutationEntityLink等)或按照您所描述的方式执行,即仅存储uuid以及某些鉴别器/类型信息并以编程方式解决(我们正在使用类似btw的方法. ). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |