2014-10-27 53 views
0

我想将JPA 2.0 Criteria API应用于Hibernate遗留应用程序,以获得类型安全的查询。手动模型创建不是一种选择;引入注释也不是(即将* .hbm.xml映射转换为JPA注释)。如何生成没有注释的JPA Static-Metamodel?

我尝试使用Hibernate的“休眠-jpamodelgen-4.3.6.Final.jar” 发电机没有运气这么远。这个想法是有一个“虚拟”实体来踢Hibernate的注释处理器(JPAMetaModelEntityProcessor)。然后,所以我的希望JPAMetaModelEntityProcessor将检测persistence.xml并最终将智能足以还检测XML配置的实体。

+0

“没有运气”是什么意思?你有错误吗?错误,警告?我还没有尝试过,但是[手动](https://docs.jboss.org/hibernate/orm/4.3/topical/html/metamodelgen/MetamodelGenerator.html)声明生成器会选择'persistence.xml'并且如果它们在类路径*上,则默认为'orm.xml'。注意“提示”:您需要将''添加到您的配置中。 – mabi 2014-10-27 23:18:10

+0

没有运气意味着在这里:只是没有按预期做,即没有生成任何东西。实际上,没有注释的实体在我的类路径中,处理器没有踢,即我甚至无法传递处理器选项,如“-Adebug = true”或指定一个不同的配置资源与“-ApersistenceXml = ...” 。 – whaefelinger 2014-10-28 10:18:05

+0

我知道,这个线程很旧。但也许现在你知道如何解决这个问题,我有与hbm.xml文件相同的问题没有生成任何东西。 – Bagdat 2017-01-30 04:05:52

回答

0

这是一个真正可惜的问题,在Hibernate v 5.2.12中提出这个问题三年之后,仍然不容易找到如何在不使用注释的情况下生成元模型。无论如何,我将在此处描述我的解决方案,因为此问题(没有任何答案)会弹出,作为查询的搜索结果“生成无注释的元模型”。我挣扎了一下这个任务,但毕竟我这个Ant任务到了那里:

<target name="jpa_metamodel"> 
    <delete dir="..\\src_tmp"/> 
    <copy todir="..\\src_tmp"> 
     <fileset dir="..\\src"> 
      <include name="my/model/package/*.java"/> 
      <include name="META-INF/**/*.xml"/> 
     </fileset> 
    </copy> 
    <replace file="../src_tmp/my/model/package/AbstractEntity.java" token="class" value="@javax.persistence.Entity class"/> 
    <javac srcdir="..\\src_tmp" 
     destdir="..\\src_jpa_generated" 
     failonerror="true" 
     fork="false"> 
     <compilerarg value="-proc:only"/> 
     <compilerarg line="-s ..\\src_jpa_generated"/> 
     <compilerarg line="-Adebug=true"/> 
     <classpath> 
      <fileset dir="..\\dependencies\\hibernate"> 
       <include name="**\\*.jar"/> 
      </fileset> 
      <pathelement location="../src_tmp"/> <!-- to put META-INF in classpath --> 
     </classpath> 
    </javac> 
</target> 

与Hibernate medamodel产生的问题是:

  • /META-INF/persistence.xml/META-INF/orm.xml中搜索在类路径,而不是在源文件夹中。然而它似乎还不够,因为映射XML被添加到类路径之后,它们被正确地发现并且生成器进程提到了类(每个类的日志条目都被发射),但是由于某种原因,仍然没有产生输出。因此,下一步......

  • 看来,如果没有实际的注释是不太可能的。或者也许是这样,但我仍然不知道如何,但我可以用简单的解决方法生活。我只是自动添加@Entity注释到临时复制的来源。其实我只在一个文件中添加注释,但在我的情况下,它恰好是我的实体层次结构的根。这可能有意义,也可能不会 - 我没有麻烦检查。然而,这一步的需要表明,为没有注释编译的实体类生成元模型可能很困难(不可能?)。

  • 您需要记住约-s编译器arg将生成的* .java文件存储在某处。

希望这可能有助于未来的某个人。