【问题标题】:Retrieving JPA Entity List and metadata检索 JPA 实体列表和元数据
【发布时间】:2012-08-10 07:35:17
【问题描述】:

我想知道是否有一种方法可以获取 JPA 中特定持久单元的所有实体类及其元数据。

我所说的元数据不仅是指字段,还包括它们的列名、长度、精度、数据类型,还有表名和我能得到的任何东西。我尝试使用元模型,但我认为这仅适用于 JPQL 查询。

我需要能够向用户显示某些 PU 的所有活动实体,并且我不想将它们硬编码到某个数组或数据库中,我希望 API 告诉我它有哪些实体。此外,如果可能的话,获取每个实体的托管实例。

我想我可以尝试使用反射来获取所有带有 @Entity 注释的类,但这不会很漂亮,而且更难知道哪个属于特定的 PU,所以如果 api 已经公开了这个信息会很棒的。

我更喜欢 JPA 兼容的解决方案,但如果不可能,Hibernate 或 EclipseLink 特定的答案可以做到。

谢谢!

【问题讨论】:

    标签: java hibernate jpa eclipselink


    【解决方案1】:

    是的,您可以从EntityManager 获取所有实体和有关实体的相应元数据信息。

    EntityManager.getMetamodel() 将允许您访问Metamodel 接口,您可以从该接口访问EntityTypeManagedType 以获取实体的属性。

    【讨论】:

    • 我不确定,我发现文档说元模型只适用于 jpql 查询,你有这方面的例子吗?
    • Metamodel 独立于 JPQL 并且真正用于条件查询,尽管它可以用于访问一些信息,例如实体名称和属性 - metamodel.getEntities() 和 EntityType.getName( ) 和 EntityType.getDeclaredAttributes() 为每个实体。这将是 JPA 数据 - 表/列信息需要提供者特定的代码。请参阅 wiki.eclipse.org/EclipseLink/FAQ/… 了解如何在 EclipseLink 中完成此操作
    • 谢谢,最后我设法使用了这个解决方案,但只有一件事,每次我尝试从 web 应用程序使用它时,它都会抛出一个 securityException,也许是 spring 正在拦截调用,任何想法如何实现这一目标??
    • 您能否分享您的代码,以便我也可以从中获得帮助。我的要求是在执行选择查询时,它应该检索记录以及列名。
    【解决方案2】:

    实体在定义时独立于任何持久性单元。它们在persistence.xml 的定义中与持久性单元相关联。为给定持久单元管理实体管理器的 EntityManagerFactory 似乎没有任何 API 来获取它管理的实体列表。 Hibernate 的 SessionFactory,EntityManagerFactory 的对应物,确实具有获取类元数据的 API (http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/SessionFactory.html)。

    【讨论】:

    • 我猜 SessionFactory.getAllCollectionMetadata 会做到这一点(我查看了它并检索了 AbstractEntityPersister 对象的映射,它似乎包含了我需要的所有信息)我仍然会等着看是否有任何在我将此标记为正确答案之前,JPA 直接方法或 EclipseLink 方法...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多