【问题标题】:How to get the PersistenceUnit name for a given entity class?如何获取给定实体类的 PersistenceUnit 名称?
【发布时间】:2011-05-13 22:34:30
【问题描述】:

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

要完成该工具的工作,我需要为给定的类获取EntityManager。要获得EntityManager,我需要EntityManagerFactory。要获得EntityManagerFactory,我需要持久化单元名称。

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

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

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

【问题讨论】:

  • 你有没有找到任何其他替代这里发布的那些?我也有同样的困境。
  • @davidmontoyago:我根据 Robin 的回答完成了使用。

标签: java jpa jpa-2.0


【解决方案1】:

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

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

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

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

【讨论】:

  • 抱歉回复晚了。我已经忘记了这个问题。我在我的问题中使用了你的答案,并略有改变。我使用getMetamodel().getEntities() 获得Set&lt;EntityType&lt;?&gt;&gt;。然后迭代 Set 以填充包含所有相关类的所有映射信息的对象。这是很多工作,但你的回答告诉我要走的路。谢谢。
【解决方案2】:

哇,我不认为有一种完美的方式来按照您描述的方式做事。

关于特定持久性单元中实体关系的静态信息的唯一来源是 persistence.xml 文件,前提是您在其中声明了实体类,因为您可以省略它们并让持久性管理器找到它们你。

也许您可以以这样一种方式组织您的代码,以明确给定类属于哪个持久性单元。例如,您可以为每个持久性单元组织包,或者您可以使用给定类所属的持久性单元创建自定义 Java 注释,然后在运行时读取该注释。

听起来怎么样?

这些想法只是一种复制方式,使用不同的静态策略,persistence.xml 应该已经知道。

【讨论】:

  • 好吧,你提出了我确实想做的事情。我不想将我的工具编码为依赖于任何特定的包组织,因为这往往会在依赖我的工具的 3rd 方项目中强加邪恶和晦涩的要求。正如您已经说过的,persistence.xml 文件可能没有所需的一切,因此依赖它不是一个好主意。正如我在最初的问题中所说,注释方法是一种选择,但看起来仍然是一个不正确的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多