如何从持久性单元获取所有@Entity类?
问题
我正在编写一个独立的实用程序,给定一个包含JPA-2注释持久性单元的jar,需要以编程方式获取特定持久性单元中所有@Entity类的列表。
我想决定采用哪种方法来获取这些信息,以及为什么; 或者如果有其他更好的方式我没有想到。
解决方案1
Java程序将jar放在类路径上,使用JavaSE方法从jar中的类创建持久性单元。 然后它使用javax.persistence类来获取JPA Metamodel,从中拉回类令牌列表。
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项目。 这将是一个什么问题?
- 该实用程序将在类路径上提供Open-EJB,以获取所有Java EE 6类的实现。
- 即使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("", mySQLDialectProps); final Metamodel mm = emf.getMetamodel(); for (final ManagedType> managedType : mm.getManagedTypes()) { managedType.getJavaType(); // this returns the java class of the @Entity object } }
关键是覆盖我的事务类型并清空我在persistence.xml中定义的jtaDataSource。 原来其他一切都是不必要的。
- jackson – 由于构造函数导致的JsonMappingException
- POST期间REST Web服务中的HTTP 400错误,FormParam包含自己的对象(例如enities)
- 如何在不使用Datastax Studio但通过Java创建图形及其模式的情况下?
- JTables中的JScrollPane
- 将声音输出到声卡的多个声道
- System.getProperty(“java.class.path”)不显示“WEB-INF / lib”和包含jar
- 用于字典的java中的Foreach循环
- Eclipse中的“与编辑器链接”function有什么作用?
- Tomcat6忽略web-inf / lib