簡體   English   中英

如何生成不帶注釋的JPA靜態元模型?

[英]How to generate JPA Static-Metamodel without annotations?

我想將JPA 2.0 Criteria API應用於Hibernate舊版應用程序,以獲取類型安全的查詢。 手動創建模型不是一種選擇。 也沒有引入注釋(即,將* .hbm.xml映射轉換為JPA注釋)。

到目前為止,我嘗試使用Hibernate的“ hibernate-jpamodelgen-4.3.6.Final.jar ”生成器沒有任何運氣。 這個想法是要在Hibernate的注釋處理器( JPAMetaModelEntityProcessor )中加入一個“虛擬”實體。 然后,因此,我希望JPAMetaModelEntityProcessor能夠檢測到persistence.xml,並最終變得足夠聰明 ,也可以檢測到XML配置的實體。

在問了這個問題三年后,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文件存儲在某個位置。

希望這對將來的人會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM