我想将JPA 2.0 Criteria API应用于Hibernate遗留应用程序,以获得类型安全的查询。手动模型创建不是一种选择;也没有引入注释(即将* .hbm.xml映射转换为JPA注释)。
到目前为止,我试图使用Hibernate的 “hibernate-jpamodelgen-4.3.6.Final.jar ”生成器。我们的想法是拥有一个“虚拟”实体来启动Hibernate的注释处理器(JPAMetaModelEntityProcessor
)。然后,我希望JPAMetaModelEntityProcessor
能够检测到persistence.xml,最终 smart 足以检测XML配置的实体。
答案 0 :(得分: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生成器的问题是:
{class 1}}和/META-INF/persistence.xml
在类路径中搜索,而不是在源文件夹中搜索。但是它似乎还不够,因为在将映射XML添加到类路径后,它们被正确发现并且生成器进程提到了类(每个类的日志条目都被发出),但由于某种原因,仍然没有产生输出。所以到下一步......
如果没有实际的注释,似乎不可能走得更远。或许它是,但我仍然不知道如何,但我可以忍受简单的解决方法。我只是自动将/META-INF/orm.xml
注释添加到临时复制的源中。实际上我只在一个文件中添加注释,但在我的情况下,它恰好是我的实体层次结构的根。这可能有意义,也可能没有 - 我没有打扰检查。但是,对此步骤的需要表明,为没有注释编译的实体类生成元模型可能很困难(不可能?)。
您需要记住 -s 编译器arg,以便在某处存储生成的* .java文件。
希望这可能对将来有所帮助。