Java 如何从持久化单元获取所有@Entity类? 问题

Java 如何从持久化单元获取所有@Entity类? 问题,java,jakarta-ee,jpa,jpa-2.0,Java,Jakarta Ee,Jpa,Jpa 2.0,我正在编写一个独立的实用程序,给定一个包含JPA-2注释的持久化单元的jar,它需要以编程方式获取特定持久化单元中所有@Entity类的列表 我想决定两种方法中的哪一种是获得这些信息的方法,以及为什么;或者如果还有更好的方法我还没有想到 解决方案1 Java程序将jar放在类路径上,使用JavaSE方法从jar中的类创建持久化单元。然后它使用javax.persistence类来获取JPA元模型,从中提取类标记列表 EntityManagerFactory emf = Persistence.c

我正在编写一个独立的实用程序,给定一个包含JPA-2注释的持久化单元的jar,它需要以编程方式获取特定持久化单元中所有@Entity类的列表

我想决定两种方法中的哪一种是获得这些信息的方法,以及为什么;或者如果还有更好的方法我还没有想到

解决方案1 Java程序将jar放在类路径上,使用JavaSE方法从jar中的类创建持久化单元。然后它使用javax.persistence类来获取JPA元模型,从中提取类标记列表

EntityManagerFactory emf = Persistence.createEntityManagerFactory("MY_ PERSISTENCE_UNIT");
Metamodel mm = emf.getMetamodel();

// loop these, using getJavaType() from Type sub-interface to get 
// Class tokens for managed classes.
mm.getManagedTypes();
解决方案2 程序扫描指定jar中的目录和文件以查找persistence.xml文件,然后找到具有指定持久性单元名称的文件。然后通过XPath文件获取
XML元素的列表,并从中读取完全限定的类名。从名称,构建类标记

限制/关切
  • 如果可能的话,我想采用方法1
  • 此实用程序不会在容器内运行,但jar是一个设计用于在容器内运行的EJB项目。这怎么会是个问题
  • 该实用工具将在类路径上提供openejb,以获得所有javaee6类的实现
  • 即使EJB项目构建为在Hibernate上运行,该实用程序也不应该是特定于Hibernate的
  • 有什么绊脚石吗

如果您的jar格式正确(persistence.xml位于正确的位置-在META-INF文件夹中),那么一切看起来都很好


没有必要在容器中运行您的实用程序,JPA不是JavaEE规范的一部分。

如果有人感兴趣,解决方案1是可行的。以下是我必须做的事情:

public MySQLSchemaGenerator() throws ClassNotFoundException {
    Properties mySQLDialectProps = new Properties();
    mySQLDialectProps.setProperty("javax.persistence.transactionType", "RESOURCE_LOCAL");
    mySQLDialectProps.setProperty("javax.persistence.jtaDataSource", "");

    final EntityManagerFactory emf = Persistence.createEntityManagerFactory("<persistence_unit_name>", mySQLDialectProps);
    final Metamodel mm = emf.getMetamodel();
    for (final ManagedType<?> managedType : mm.getManagedTypes()) {
      managedType.getJavaType(); // this returns the java class of the @Entity object
    }
  }
public MySQLSchemaGenerator()抛出ClassNotFoundException{
Properties mysqldiallationprops=新属性();
setProperty(“javax.persistence.transactionType”、“RESOURCE_LOCAL”);
setProperty(“javax.persistence.jtaDataSource”,”);
final EntityManagerFactory emf=Persistence.createEntityManagerFactory(“,mysqlprops);
最终元模型mm=emf.getMetamodel();
对于(最终ManagedType ManagedType:mm.getManagedTypes()){
managedType.getJavaType();//返回@Entity对象的java类
}
}

关键是重写我的事务类型并清空在my persistence.xml中定义的jtaDataSource。原来其他一切都是多余的。

对我来说不错,但我对这方面还不熟悉。您的控制器看起来怎么样?我的jar格式良好,当我部署到JBoss上时,bean工作正常。事实上,我在一号公路上进展很顺利。我必须想办法覆盖持久化单元中的一系列设置,如事务类型(设置为JTA,需要是Resource_Local)(如果我将它们注释掉,util运行正常,但无法运行部署到应用服务器的OK)。覆盖数据源还存在一些问题…希望很快有机会对其进行更多的工作,并在其完全工作后发布我得到的代码。当然JPA是JEE规范的一部分,它是JSR。您可以在JEE容器外运行它,因为有一些独立的实现,比如hibernate。(hibernate不仅仅是一个JPA实现,它存在于规范之前,他们只是提供了法规遵从性)