gpt4 book ai didi

java - 如何获取给定实体类的 PersistenceUnit 名称?

转载 作者:行者123 更新时间:2023-11-30 09:49:05 26 4
gpt4 key购买 nike

我正在开发一种使用 JPA2 处理某些数据库实体的工具,并将 hibernate 作为持久性提供程序。该工具是通用的并且与任何业务逻辑无关,它需要一个通用的 Class<? extends Task>参数来完成它的业务,其中 Task 是我创建的一个接口(interface),用于说明实现实体具有一些我的工具感兴趣的行为。该工具的工作包括从数据库中获取给定类的实例并操作它们的某些属性。它是一个通用工具,因为它正在开发为可重用,并且我们有大量实体类(但不是所有实体类)实现该接口(interface)(主要是那些模拟某些类型的运行业务任务的实体)。

要完成该工具的工作,我需要获得 EntityManager对于给定的类。获得 EntityManager , 我需要一个 EntityManagerFactory .获得 EntityManagerFactory , 我需要持久化单元名称。

因此,我的问题是给定一个实体类,获取其持久性单元的名称。但是,如果没有用于该持久性单元的已经存在的 EntityManager,我没有找到任何方法来执行此操作,这会产生先有鸡还是先有蛋,关键锁在胸中的问题。

部分解决方案是将持久化单元的名称与实体类一起传递,但这看起来是错误的,因为持久化单元的名称应该从给定的类中推断(或至少猜测)。这可以优化为将名称放在实体类的注释中,但这看起来仍然是一个不正确的解决方案。搜索和分析 persistence.xml文件是我们真正想要避免的东西。

那么,我能做些什么来解决这个问题呢?有什么想法吗?

最佳答案

我很确定不可能确定实体类关联的持久化单元,因为 JPA 的设计是相反的:通常您为特定的持久化单元注入(inject)一个 EntityManagerFactory。

如果您至少拥有所有可用持久性单元的名称,您可以使用 Persistence.createEntityManagerFactory(persistenceUnitName) 创建所有可用工厂,然后使用其元模型检查某个类是否属于某个单元:

for (EntityManagerFactory emf : factories) {
try {
EntityType<?> entity = emf.getMetamodel().entity(classToCheck);
// bingo
} catch (Exception e) {
// wrong persistence unit
}
}

或者您检查 MetaModel.getEntities() 并构建单元名称到托管实体类的映射。

关于java - 如何获取给定实体类的 PersistenceUnit 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5998422/

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