[英]How to generate List instead of Set with Hibernate tools reverse engineering?
我想知道在對數據庫進行逆向工程時如何進入由 Hibernate 工具生成的 POJOS,比如 List 而不是 Set。
有沒有辦法在文件reveng.xml中指定?
答案取決於工程管道。 我使用hibernate-tools 4.3.5.Final 和 Ant 任務hibernatetool具有顯着的配置:
<hbm2hbmxml/>
用於生成 HBM 文件;<hbm2java jdk5="true" ejb3="true"/>
從 HBM 創建 Java 類。 解決方案在 HBM 內容中。 沒有。 hbm2hbmxml是由reveng.xml配置的。 Péter 的回答建議在<column/>
指定所需的類型,但OneToMany沒有列。 關系可以明確定義如下
<table name="MY_TABLE">
<foreign-key constraint-name="FK_TO_MY_TABLE_IN_OTHER_TABLE">
<set property="otherTables"/>
</foreign-key>
</table>
注意<set/>
元素。 hibernate-reverse-engineering-3.0命名空間中沒有<list/>
或其他集合。 我還沒有找到在reveng.xml或通過 Ant 任務參數更改集合類型的方法,因此生成的 HBM 中的每個關系都是<set>
元素(在hibernate-mapping-3.0命名空間中)。
是的。 HBM 文件必須包含所需的類型元素( <list>
、 <bag>
、 <map>
等)而不是<set>
。 默認情況下,Hibernate 工具使用 JAR 文件夾hbm和pojo 中的模板。 每一個都可能被hibernatetool Ant 任務的templatepath屬性中指定的文件夾的子文件夾中的文件覆蓋。 您需要在hbm文件夾中提供自定義 FreeMaker 模板並進行以下修改。
在persistentclass.hbm.ftl的末尾替換
<#if c2h.getTag(property)!="version" && c2h.getTag(property)!="timestamp">
with(通知模板名稱以list開頭,所需的集合類型,並且已設置處理的標簽)
<#if c2h.getTag(property) == "set">
<#include "list.hbm.ftl"/>
<#elseif c2h.getTag(property)!="version" && c2h.getTag(property)!="timestamp">
在list.hbm.ftl 中刪除以下行(因為 set 沒有 index 屬性)
<#assign indexValue = value.getIndex()>
並替換強制元素
<list-index>
<#foreach column in indexValue.columnIterator>
<#include "column.hbm.ftl">
</#foreach>
</list-index>
with(用你喜歡的任何東西代替ID
,它不存在於生成的 Java 代碼中)
<list-index column="ID"/>
列表意味着順序。 我建議添加帶有相關實體 ID 字段名稱的OrderBy
注釋。 在<#include "meta.hbm.ftl">
之后添加到list.hbm.ftl
<meta attribute="scope-get">@javax.persistence.OrderBy("id") public</meta>
maggu 建議添加extra-import元屬性,以便在類文件中只提及一次包名稱,但根據我的經驗,它會使用未定義的符號破壞構建。
注意注釋后的實際范圍。 沒有辦法把它放在單獨的行上(空白被修剪)。
范圍 hack 的替代方法是在pojo構建階段(一個帶有hbm2java )中添加特定的注釋以及其他注釋,例如,添加到Ejb3PropertyGetAnnotation.ftl內的<#elseif c2h.isCollection(property)>
塊下面的行
<#if property.value.type.returnedClass.simpleName == "List">@javax.persistence.OrderBy("id")</#if>
<list>
和<bag>
導致new ArrayList<>(0)
作為默認字段值,但list公開為有用的java.util.List ,而bag只是java.util.Collection 。 應該可以通過collection-type屬性更改此設置(也適用於set ),但它僅接受org.hibernate.usertype.UserCollectionType實現,而不接受 JDK 類。
在我的項目中,我必須僅針對某些關系將Set替換為List ,因此我的list.hbm.ftl包含<#if property.name == "otherTables">
。 您可以根據需要調整條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.