一尘不染

在运行时扩展JPA实体数据

hibernate

我需要允许客户端用户在运行时扩展JPA实体包含的数据。换句话说,我需要在运行时向实体表添加一个 虚拟列 。该 虚拟列 将仅适用于某些 数据行,
并且可能有很多这些 虚拟列 。因此,我不想在数据库中创建实际的其他列,而希望使用代表这些 虚拟列 的其他实体。

例如,请考虑以下情况。我有一个 Company 实体,其字段标记为 Owner ,其中包含对 Company Owner
的引用。在运行时,客户端用户决定,所有的 公司 属于一个特定的 所有者 应该有额外的字段标 ContactDetails

我的初步设计使用了另外两个实体来完成此任务。第一个基本上代表 虚拟列, 并包含诸如字段名和期望值类型之类的信息。另一个代表实际数据,并将实体行连接到
虚拟列 。例如,第一个实体可能包含数据“ ContactDetails”,而第二个实体可能包含“ 555-5555”。

这是执行此操作的正确方法吗?有更好的选择吗?另外,在加载原始实体时 自动 加载此数据的最简单方法是什么?我希望我的DAO调用返回该实体及其 扩展名

编辑:我将示例从标记为 Type 的字段(可能是 合作伙伴客户) 更改为当前版本,因为它令人困惑。


阅读 213

收藏
2020-06-20

共1个答案

一尘不染

也许更简单的选择是向每个Company添加CLOB列,并将扩展存储为XML。与您的解决方案相比,这里有一组不同的权衡取舍,但是只要多余的数据不需要通过SQL即可访问(没有索引,fkey等),它可能会比您现在做的要简单。

这也意味着,如果您对多余的数据有一些幻想的逻辑,则需要以不同的方式实现它。例如,如果您需要所有可能的扩展类型的列表,则必须单独进行维护。或者,如果您需要搜索功能(通过电话号码查找客户),则需要使用Lucene或类似的解决方案。

如果您有兴趣,我可以详细说明。

编辑:

要启用搜索,您需要像lucene这样的东西,它是对任意数据进行自由文本搜索的强大引擎。还有一个hibernate-
search
,它使用注释等将lucene直接与hibernate集成在一起-
我没用过,但是我听说过它的好处。

为了获取/写入/访问数据,您基本上是在处理XML,因此应采用任何XML技术。最好的方法实际上取决于实际内容及其使用方式。我建议您考虑使用XPath进行数据访问,或者考虑定义自己的hibernate用户类型,以便将所有访问都封装到一个类中,而不仅仅是普通的String。

2020-06-20