我需要允许客户端用户在运行时扩展JPA实体包含的数据。换句话说,我需要在运行时向实体表添加一个 虚拟列 。该 虚拟列 将仅适用于某些 数据行, 并且可能有很多这些 虚拟列 。因此,我不想在数据库中创建实际的其他列,而希望使用代表这些 虚拟列 的其他实体。
例如,请考虑以下情况。我有一个 Company 实体,其字段标记为 Owner ,其中包含对 Company Owner 的引用。在运行时,客户端用户决定,所有的 公司 属于一个特定的 所有者 应该有额外的字段标 ContactDetails 。
我的初步设计使用了另外两个实体来完成此任务。第一个基本上代表 虚拟列, 并包含诸如字段名和期望值类型之类的信息。另一个代表实际数据,并将实体行连接到 虚拟列 。例如,第一个实体可能包含数据“ ContactDetails”,而第二个实体可能包含“ 555-5555”。
这是执行此操作的正确方法吗?有更好的选择吗?另外,在加载原始实体时 自动 加载此数据的最简单方法是什么?我希望我的DAO调用返回该实体及其 扩展名 。
编辑:我将示例从标记为 Type 的字段(可能是 合作伙伴 或 客户) 更改为当前版本,因为它令人困惑。
也许更简单的选择是向每个Company添加CLOB列,并将扩展存储为XML。与您的解决方案相比,这里有一组不同的权衡取舍,但是只要多余的数据不需要通过SQL即可访问(没有索引,fkey等),它可能会比您现在做的要简单。
这也意味着,如果您对多余的数据有一些幻想的逻辑,则需要以不同的方式实现它。例如,如果您需要所有可能的扩展类型的列表,则必须单独进行维护。或者,如果您需要搜索功能(通过电话号码查找客户),则需要使用Lucene或类似的解决方案。
如果您有兴趣,我可以详细说明。
编辑:
要启用搜索,您需要像lucene这样的东西,它是对任意数据进行自由文本搜索的强大引擎。还有一个hibernate- search,它使用注释等将lucene直接与hibernate集成在一起- 我没用过,但是我听说过它的好处。
为了获取/写入/访问数据,您基本上是在处理XML,因此应采用任何XML技术。最好的方法实际上取决于实际内容及其使用方式。我建议您考虑使用XPath进行数据访问,或者考虑定义自己的hibernate用户类型,以便将所有访问都封装到一个类中,而不仅仅是普通的String。