我正在编写一个独立的实用程序,给定一个包含JPA-2注释持久性单元的jar,需要以编程方式获取特定持久性单元中所有@Entity类的列表。
我想决定采用哪种方法获取此信息,以及为什么;或者如果有其他更好的方式我没有想到。
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();
程序扫描指定jar中的目录和文件以获取persistence.xml文件,然后找到具有指定持久性单元名称的文件。然后XPath该文件以获取<class>
XML元素的列表并从那里读取完全限定的类名。从名称,构建类标记。
答案 0 :(得分:13)
如果有人对此感兴趣,解决方案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
}
}
关键是覆盖我的事务类型并清空我在persistence.xml中定义的jtaDataSource。结果证明其他一切都是不必要的。
答案 1 :(得分:1)
如果你的jar格式正确(persistence.xml在正确的位置 - 在META-INF文件夹中),那么一切看起来都很好。
没有必要在容器内运行实用程序,JPA不是JavaEE规范的一部分。