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

2024-05-08

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

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

显然这不是那么容易做到的,我希望得到提示。

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

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

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


您需要使用XML版本 http://docs.jboss.org/hibernate/stable/core/reference/en/html/tutorial-firstapp.html#tutorial-firstapp-mapping配置而不是注释。这样您就可以在运行时动态生成 XML。

或者也许是类似的东西动态JPA http://www.dynamicjava.org/projects/dynamic-jpa你会感兴趣吗?

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

第一个问题是:可以存储实体的一组表是否已知?我的意思是您不是在运行时动态创建表并希望将实体与它们关联。比方说,这种情况需要知道三个表编译时。如果是这种情况,您可以使用 JPA 继承。 OpenJPA 文档详细介绍了每个班级的桌子 http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/jpa_overview_mapping_inher.html#jpa_overview_mapping_inher_tpc继承策略。

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

如果您希望它真正动态并在表之间移动实体(本质上),那么我不确定 JPA 是适合您的工具。一个大量的魔法 http://www.cforcoding.com/2009/05/orms-vs-sql-jpa-story.html使 JPA 正常工作,包括加载时编织(检测)以及通常的一层或多层缓存。更重要的是,实体管理器需要记录更改并处理管理对象的更新。据我所知,没有一种简单的工具可以指示实体管理器将给定实体存储在一个表或另一个表中。

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

较低级别的 SQL/JDBC 框架,例如Ibatis http://www.cforcoding.com/2009/06/spring-and-ibatis-tutorial.html可能是一个更好的选择,因为它会给你你想要的控制权。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA:运行时如何指定类对应的表名? 的相关文章

随机推荐