一尘不染

JPA:如何在运行时指定与类相对应的表名?

hibernate

(注意:我对Java非常熟悉,但是对Hibernate或JPA却不熟悉:)

我想编写一个通过JPA与DB2 /
400数据库进行通讯的应用程序,现在我可以获取表中的所有条目并将它们列出到System.out中(用于MyEclipse进行反向工程)。我知道@Table批注会导致名称由类静态编译,但是我需要能够使用在运行时提供名称和架构的表(它们的定义相同,但是我们有很多他们)。

显然,这并不是一件容易的事,我希望得到一个提示。

我目前选择了Hibernate作为JPA提供程序,因为它可以处理这些数据库表未记录的日志。

因此,问题是,如何在运行时告诉JPA的Hibernate实现,类A对应于数据库表B?

(编辑:Hibernate
NamingStrategy中重写的tableName()可能允许我解决此固有限制,但我仍然希望使用与供应商无关的JPA解决方案)


阅读 656

收藏
2020-06-20

共1个答案

一尘不染

您需要使用配置的XML版本而不是注释。这样,您可以在运行时动态生成XML。

还是像Dynamic JPA这样的东西会让您感兴趣?

我认为有必要进一步澄清与该问题有关的问题。

第一个问题是:可以存储实体的表集是否已知?通过这种方式,我的意思是您不是在运行时动态创建表,而是希望将实体与它们关联。例如,这种情况要求在 编译时
知道三个表。如果是这种情况,则可以使用JPA继承。OpenJPA文档详细说明了每个类继承策略的

这种方法的优点是它是纯JPA。但是,它具有局限性,因为必须知道表,并且您不能轻易更改给定对象存储在哪个表中(如果这是您的要求),就像OO系统中的对象通常不会更改类一样或类型。

如果您想让它真正地动态并且在表之间(实质上)移动实体,那么我不确定JPA是否适合您。一个可怕的很多神奇的进入使JPA工作包括加载时织入(仪器)和缓存通常是一个或多个级别。此外,实体管理器还需要记录更改并处理托管对象的更新。我没有简单的工具可以指示实体管理器将给定实体存储在一个表或另一个表中。

这种移动操作将隐式要求从一个表中删除并插入到另一个表中。如果有子实体,这将变得更加困难。并非没有关系,但是这是一个不寻常的极端情况,我不确定有人会打扰到您。

诸如Ibatis之类的较低级SQL / JDBC框架可能会更好,因为它将为您提供所需的控件。

我还考虑过在运行时动态更改或分配注释。尽管我尚不确定这是否可能,即使我不确定是否一定有帮助。我无法想象实体管理器或缓存不会因发生这种事情而毫无希望地混淆。

我想到的另一种可能性是在运行时动态创建子类(作为匿名子类),但这仍然存在注释问题,而且我不确定如何将其添加到现有的持久性单元中。

如果您提供有关您正在做的事情和原因的更多详细信息,可能会有所帮助。不管是什么,我都倾向于认为您需要重新考虑自己在做什么或如何做,或者需要选择其他持久性技术。

2020-06-20