gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:00 25 4
gpt4 key购买 nike

(注意:我非常熟悉 Java,但不熟悉 Hibernate 或 JPA - 还 :))

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

显然这不是那么容易做到,我会很感激你的提示。

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

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

(编辑:Hibernate NamingStrategy 中重写的 tableName() 可能允许我解决这个固有限制,但我仍然更喜欢与供应商无关的 JPA 解决方案)

最佳答案

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

或者类似 Dynamic JPA 的东西你会感兴趣吗?

我认为有必要进一步澄清这个问题。

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

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

如果您希望它是真正动态的并在表之间移动实体(本质上),那么我不确定 JPA 是否适合您。一个awful lot of magic使 JPA 工作,包括加载时编织(检测)和通常的一个或多个缓存级别。更重要的是,实体管理器需要记录变化并处理管理对象的更新。据我所知,没有简单的工具可以指示实体管理器将给定实体存储在一个或另一个表中。

这样的移动操作将隐含地要求从一个表中删除并插入到另一个表中。如果有子实体,这会变得更加困难。请注意,这并非不可能,但这是一个非常不寻常的极端情况,我不确定是否有人会为此烦恼。

较低级别的 SQL/JDBC 框架,例如 Ibatis可能是更好的选择,因为它会给你想要的控制权。

我还考虑过在运行时动态更改或分配注释。虽然我还不确定这是否可能,但即使是,我也不确定它是否一定有帮助。我无法想象实体管理器或缓存不会被发生的那种事情弄得绝望。

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

如果您提供更多关于您正在做什么以及为什么这样做的详细信息,这可能会有所帮助。不管是什么,我倾向于认为您需要重新考虑您正在做的事情或您是如何做的,或者您需要选择一种不同的持久性技术。

关于java - JPA:如何在运行时指定类对应的表名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/906671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com