当前位置: 首页 > 面试题库 >

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

荀子轩
2023-03-14
问题内容

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

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

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

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

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

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


问题答案:

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

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

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

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

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

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

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

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

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

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

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



 类似资料:
  • 问题内容: 我有一个问题,我只能使用一个数据库,但我有多个服务器,希望它们为每个服务器使用不同的表名。 现在,我的班级配置为: 我希望能够使dev1服务器指向loader_queue_dev1表,例如dev2服务器指向loader_queue_dev2表。 有没有可以使用注释或不使用注释的方法? 我希望能够拥有一个单一的构建,然后在运行时使用诸如系统属性之类的东西来更改该表名。 问题答案: 对于H

  • 我想在Jenkins运行一个脚本10小时。这可能吗?我的脚本长度大约是55分钟。我现在已经安排它每小时运行一次。所以它保持每小时运行一次。(永不停止!!) 但是有没有办法让它在指定的时间内运行,比如说10个小时,然后自动停止?我希望它指定这个55分钟的脚本应该连续运行多长时间,然后自动停止,而不是安排。 所以,如果我在上午8点开始构建,并说运行3小时,它应该一直运行到上午11点,然后停止。

  • 我的应用程序动态创建表,我不知道如何使用Spring jdbc读取表,而不将其硬编码到字符串查询中。我在想这样的事情: 但spring不喜欢问号:-( 谢谢你的帮助!

  • 问题内容: 在网络上快速搜索发现三个或四个变种人如何被指定和在。 指定JPA 2.1版的“正确”方式是什么? 我正在使用 问题答案: 根据官方文档,它必须是(像您的一样):

  • 我试图理解hibernate是如何工作的,即在类上放置@Entity是如何使它成为一个持久类的?即

  • 问题内容: 在Java中,是否可以在应用程序运行时动态创建类定义,然后创建该类的对象? 例如,正在运行的应用程序将读取一个文本文件,该文件包含要包含在新类中的类成员列表。然后,应用程序将基于成员列表定义类定义,然后使其实例化。 问题答案: 是的,这样做是有可能的,从理论上讲,您的类文件是字节代码,而字节代码最后是字节数组!然后可以使用defineClass(String,byte [],int,i