如何在没有注释的情况下生成JPA Static-Metamodel?

时间:2014-10-27 22:44:18

标签: java xml hibernate jpa

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

到目前为止,我试图使用Hibernate的 “hibernate-jpamodelgen-4.3.6.Final.jar ”生成器。我们的想法是拥有一个“虚拟”实体来启动Hibernate的注释处理器(JPAMetaModelEntityProcessor)。然后,我希望JPAMetaModelEntityProcessor能够检测到persistence.xml,最终 smart 足以检测XML配置的实体。

1 个答案:

答案 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文件。

希望这可能对将来有所帮助。