我需要允许客户端用户在运行时扩展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。
问题内容: 所以对于这个项目,我试图在运行时扩展一个类。我想知道,这有可能吗?如果是这样,我该怎么办?是否有用于这些目的的库? 问题答案: CGLib是您要查找的库。它在扩展类或在运行时实现接口方面非常强大,因此许多流行的框架(如Spring或Hibernate)都使用它。 您可以使用以下代码创建类扩展 尽管您可能会使用具有所需逻辑的有用的方法拦截器替换回调。
问题内容: 我有能力在编译时扩展一个类,但是我需要能够在运行时使用已实例化的超类的实例创建此子类的实例。 从理论上讲这应该是可能的,因为已经在子类构造函数之前调用了超类构造函数。 我没有足够的程序访问权限来更改实例化到我的子类或中断原始实例化。 用例:现有一个类X实例的数组。我的代码在之后加载。我需要使用已加载的子类Y扩展X来覆盖实例X之一的方法之一。父程序仅通过该数组访问对象,因此我想用Y实例替
Windows运行时组件是自包含的对象,可以从任何语言(包括 C# ,Visual Basic,JavaScript和C++)实例化和使用。 除了在上一章中看到的.NET Core元包之外,UWP应用程序还有一个默认的引用 - 通用Windows SDK。 通用Windows是对Windows运行时的引用,它已被考虑到一系列API契约中。 设备系列中的一组API被分解为称为API契约的细分。可以在
问题内容: 我需要知道是否有可能通过扩展将某些属性和行为添加到某些POJO JPA实体(使用 hibernate 提供程序),然后使EntityManager返回扩展对象而不是仅返回pojo实体,如以下示例: POJO JPA实体类 扩展类 获取扩展类的对象 我评估的另一种可能的方法是使用复合实体扩展功能,并委派所有设置方法和获取方法,但这可能意味着需要处理大量表: 任何建议将不胜感激。 问题
我有一个Hibernate实体,,它工作正常: 我想确定此对象何时更改并在我的应用程序中更新一些。我能想到的最简单的方法是扩展并覆盖setter: 这在我的应用程序中工作得很好,但是当我开始持久化实体时,Hibernate抱怨它不知道什么是< code>ExtendedEvent。 我可以看出扩展Hibernate实体是一个不小的问题,尤其是当您开始添加字段时——但是我所希望的是Hibernate
问题内容: 为什么实现Runnable比从Thread类扩展更好的选择? 问题答案: 这样,您就可以 将 计算( what )与执行( when 和/或 how )分离。 使用或,您可以例如向提交许多工作/计算,这将使您计划工作。这是ExecutorService的摘录形式: 与直接使用线程相比,使用/ 给您更大的灵活性。