首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从持久性单元获取所有@Entity类?

如何从持久性单元获取所有@Entity类?
EN

Stack Overflow用户
提问于 2012-04-11 16:37:36
回答 2查看 8.2K关注 0票数 14

问题

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

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

解决方案1

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

代码语言:javascript
复制
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文件以获取<class> XML元素的列表,并从其中读取完全限定的类名。根据名称构建类标记。

制约/关切

  • ,如果可能的话,我想使用方法1。
  • 这个实用程序不会在容器中运行,但是jar是一个设计用于在容器中运行的EJB项目。这怎么会是一个问题呢?
  • 实用工具将在类路径上提供Open,以获得所有Java 6类的实现。尽管EJB项目是构建在Hibernate上的,但该实用程序不应该是任何障碍?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-12 03:21:31

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-14 02:20:06

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

代码语言:javascript
复制
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中定义的persistence.xml空出。其他的一切都是不必要的。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10110202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档