获取JPA实体列表和元数据

10

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

元数据指的不仅是字段,还包括列名、长度、精度、数据类型以及表名等所有内容。我已经尝试使用元模型,但我认为那更适用于JPQL查询。

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

我想尝试使用反射来获取所有带有@Entity注释的类,但这并不美观,也更难知道哪些属于特定的PU,因此如果API已经公开了此信息,那将很好。

我更喜欢符合JPA规范的解决方案,但如果不可能的话,Hibernate或EclipseLink特定的答案也可以。

谢谢!

2个回答

13

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

EntityManager.getMetamodel()将使您可以访问Metamodel接口,从那里您可以访问EntityTypeManagedType来获取实体的属性。


我对此不太确定,我找到的文档说元模型只适用于jpql查询,你有任何关于此的示例吗? - Frank Orellana
2
元模型独立于JPQL,实际上用于标准查询,尽管可以用来访问一些信息,例如实体名称和属性 - metamodel.getEntities(),然后对于每个实体使用EntityType.getName()和EntityType.getDeclaredAttributes()。这将是JPA数据 -表/列信息需要提供程序特定代码。请参见http://wiki.eclipse.org/EclipseLink/FAQ/JPA#How_to_access_table.2C_column_and_schema_information_at_runtime.3F以了解如何在EclipseLink中完成此操作。 - Chris
谢谢,最终我成功使用了这个解决方案,但是有一个问题,每次我尝试从Web应用程序中使用它时,都会抛出SecurityException异常,可能是Spring拦截了调用,你有什么想法如何解决这个问题吗? - Frank Orellana
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - sunny_dev

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

1
我猜SessionFactory.getAllCollectionMetadata会做到这一点(我查看了它,它检索AbstractEntityPersister对象的映射,这似乎有我需要的所有信息)。不过,在我将其标记为正确答案之前,我仍然想等待是否有任何JPA直接方法或EclipseLink方法...谢谢! - Frank Orellana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接