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