加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在JPA中链接不同实体类型的最佳方法

发布时间:2020-12-14 16:21:26 所属栏目:Java 来源:网络整理
导读:匆忙的简短版本: 我的域模型中有不同的表/实体具有相同的字段(UUID).有一个表,我需要将这些实体的行/实例链接到其他JPA管理的实体.换句话说,该链接表中的字段的实例将不会在前面被知道.我可以想到的两种方法是: 使用抽象实体和TABLE_PER_CLASS策略,或 使用
匆忙的简短版本:

我的域模型中有不同的表/实体具有相同的字段(UUID).有一个表,我需要将这些实体的行/实例链接到其他JPA管理的实体.换句话说,该链接表中的字段的实例将不会在前面被知道.我可以想到的两种方法是:

>使用抽象实体和TABLE_PER_CLASS策略,或
>使用@MappedSuperClass在链接表中存储实例的类名,或类似的东西,可以让我定义从正确的表获取实际实例的逻辑.

两者在复杂性和性能方面都有优缺点.你认为最好的是,可能有第三个选择,或者你以前曾经尝试过这样的事情,并提出建议/强烈警告?

长版本,如果你想要更多的背景:

我有一个数据库/对象模型,其中许多类型具有公共字段:普遍唯一的标识符(UUID).原因是这些类型的实例可能会发生变化.这些更改遵循命令模型,它们的数据可以被封装,并且本身也保持不变.让我们把这个改变叫做“突变”.必须有可能发现数据库中哪些突变存在于任何给定的实体中,反之亦然,在哪个实体上存储的突变进行操作.

使用UUID作为一个(非常简化)的例子:

要存储“突变”,我们使用一个名为MutationHolder的表/实体.要将突变链接到其目标实体,有一个MutationEntityLink.这个数据不直接在MutationHolder上的唯一原因是因为可以有直接或间接的链接,但这在这里并不重要,所以我留下来:

问题归结为如何在MutationEntityLink中建模实体字段.我可以想到两种方法.

第一个是使用UUID字段创建一个抽象的@Entity注释类.客户,合同和地址将会延长.所以这是一个TABLE_PER_CLASS策略.我假设我可以使用它作为实体字段的类型,尽管我不确定.但是,由于JPA需要查询许多表才能找到实际的实例,我可能会遇到严重的性能损失.

第二个是简单地使用@MappedSuperClass,并将实体的UUID存储在MutationEntityLink的实体字段中.为了获得具有该UUID的实体,我必须以编程方式解决它.使用实体的类名添加附加列,或者允许我识别它或将其粘贴到JPQL查询中的其他列.这需要更多的工作,但似乎更有效率.我不反对编码一些实用程序类或做一些反射/自定义注释工作,如果需要的话.

我的问题是哪些方法似乎最好?或者,你可能有一个更好的建议,或通知我错过了一些东西;例如,也许有一种方法可以使用TABLE_PER_CLASS继承来添加类型列,以将JPA指向正确的表格?也许你已经尝试了这样的事情,并且想要警告我会出现许多问题.

一些额外的信息:

>我们创建数据库模式,所以我们可以添加任何我们想要的.
>单表继承策略不是一个选择.表必须保持不变.出于同样的原因,加入继承似乎也不是很好的适合.
> JPA提供程序是Hibernate,并且使用不属于JPA标准的东西不是问题.

解决方法

如果实体没有任何共同之处,除了有一个uuid我会使用你描述的第二种方法:使用MappedSuperclass.使共同的超类成为一个实体将阻止您在需要时使用不同的继承策略,即使没有实例存在,并且从业务角度来看,它也需要一个超级实体的表.

链路本身可以以多种方式实现,例如您可以为每个实体子类化MutationEntityLink(例如CustomerMutationEntityLink等)或按照您所描述的方式执行,即仅存储uuid以及某些鉴别器/类型信息并以编程方式解决(我们正在使用类似btw的方法. ).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读