有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从持久化单元中获取所有@Entity类?

问题

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

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

解决方案1

Java程序将jar放在类路径上,使用JavaSE方法从jar中的类创建持久化单元。然后它使用javax。持久性类要获得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中的目录和文件以获得持久性。xml文件,然后查找具有指定持久性单元名称的文件。然后通过XPath文件获取<class>XML元素的列表,并从中读取完全限定的类名。根据名称,构建类标记

限制/担忧

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

共 (1) 个答案

  1. # 1 楼答案

    如果有人感兴趣,解决方案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
        }
      }
    

    关键是重写我的事务类型,并清空在持久性中定义的jtaDataSource。xml。结果发现其他一切都是多余的