【问题标题】:How to generate JPA Static-Metamodel without annotations?如何在没有注释的情况下生成 JPA 静态元模型?
【发布时间】:2014-12-23 06:06:09
【问题描述】:

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

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

【问题讨论】:

  • “没有运气”是什么意思?你有错误吗?错误、警告?我还没有尝试过,但manual 声明生成器将默认获取persistence.xmlorm.xml如果它们在类路径上。注意“提示”:您需要将<persistence-unit-metadata><xml-mapping-metadata-complete/></persistence-unit-metadata> 添加到您的配置中。
  • 这里没有运气的意思:只是没有按预期进行,即没有生成任何内容。实际上,如果我的类路径中没有带注释的实体,处理器就不会启动,即我什至无法传递诸如“-Adebug=true”之类的处理器选项或使用“-ApersistenceXml=...”指定不同的配置资源.
  • 我知道,这个帖子很老了。但也许现在你知道如何解决这个问题了,我对 hbm.xml 文件也有同样的问题,没有生成任何东西。
  • @Bagat - 最终我不得不硬着头皮接受没有类型安全查询的生活。对不起。
  • 我有同样的需要,类型安全的查询,没有使用休眠元模型生成器。我专门为此目的创建了一个小型开源项目,请查看:github.com/grozandrei/exposable

标签: java xml hibernate jpa


【解决方案1】:

很遗憾,在提出这个问题三年后,使用 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 文件存储在某处。

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

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 2022-11-10
    • 2017-12-11
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2013-01-13
    • 2016-04-26
    • 2019-01-19
    相关资源
    最近更新 更多