簡體   English   中英

如何使用 Hibernate 工具逆向工程生成 List 而不是 Set?

[英]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 內容中。

有沒有辦法在文件reveng.xml中指定?

沒有。 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 文件夾hbmpojo 中的模板。 每一個都可能被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.

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