2011-03-09 73 views
5


我在Eclipse(Helios)中使用Hibernate工具3.40。 我試圖用我的數據庫(MSSQL 2008)和EJB3風格(即JPA2.0註釋)生成POJO。
比方說,我有兩個表AB那裏是一個外鍵從AB
默認情況下,它會生成一個A的POJO,其中B作爲成員(其「父級」),POJO爲B,其Set<A>作爲成員(其「子級」)。
我想是知道我怎麼能控制轉-ENG使創建只有一個協會的一側(我有不同的使用情況下,所以基本上所有的三個選項都對我很重要)。
我不希望使用的hbm.xml因爲我有註釋和JPA2.0工作的文件,但我可以指定在逆向工程過程中的一些元數據爲經由hibernae.reveng.xml冬眠逆向工程問題多對一的單向關聯與休眠工具

我試着配置foreign-key屬性,定義在那裏的exclude=true但只給我提供了一個半答案一個場景。生成一個A POJO用這是可以容忍和可理解的BPK INT構件B所生成的POJO現在不編譯爲one-to-many註釋具有無效屬性; mappedby="unresolved"由於A不再具有hibernate reveng可映射回的屬性。

所以,我目前無法創建單向協會,我會很感激的任何幫助。

回答

3

Hibernate Code Generation Configuration

實施例創建reveng. strategy一類:

public class MyReverseEngineeringStrategy extends DelegatingReverseEngineeringStrategy { 

    public MyReverseEngineeringStrategy(ReverseEngineeringStrategy delegate) { 
     super(delegate); 
    } 

    @Override 
    public void setSettings(ReverseEngineeringSettings settings) { 
     super.setSettings(settings); 
    } 

    @Override 
    public boolean excludeForeignKeyAsCollection(String keyname, 
    TableIdentifier fromTable, java.util.List fromColumns, 
    TableIdentifier referencedTable, java.util.List referencedColumns) { 

    // TODO : Your work here 
    if (keyname.equals("___") && 
     fromTable.getName().equals("___") && 
     fromColumns.contains("___") && 
     referencedTable.getName().equals("___") && 
     referencedColumns.contains("___")) { 

     return true; 
    } 

    return false; 
    } 
} 

爲方法excludeForeignKeyAsCollection

Should this foreignkey be excluded as a oneToMany 

的JavaDoc和有也有另一種方法,呼叫excludeForeignKeyAsManytoOne

Should this foreignkey be excluded as a many-to-one 
+1

非常感謝。我希望有一個更好的方法來做到這一點,而不是在這個「晦澀」的類中對這些需求進行硬編碼,但至少這是一個可行的解決方案。 – Ittai

+0

我有同樣的問題,但你的答案是「___」的具體情況,這不是一般的答案。不管怎麼說,還是要謝謝你 – Kummo

0

目前(與Hibernate工具5.2測試),產生單向多到一個工作的。

在文檔(https://docs.jboss.org/tools/4.0.0.Final/en/hibernatetools/html_single/index.html#hibernaterevengxmlfile),你可以看到,您可以排除的關係的一些副作用:

例如(重命名屬性)

<!-- control many-to-one and set names for a specific named foreign key constraint --> 
<foreign-key constraint-name="ORDER_CUST"> 
    <many-to-one property="customer"/> 
    <set property="orders"/> 
</foreign-key> 

或(不包括屬性)

<!-- can also control a pure (shared pk) one-to-one --> 
    <foreign-key constraint-name="ADDRESS_PERSON"> 
    <one-to-one exclude="false"/> 
    <inverse-one-to-one exclude="true"/> 
    </foreign-key> 

因此,只與@ManyToOne建立關係的一方,您可以執行以下操作:

<table name="city" schema="public"> 
    <primary-key property="id"> 
     <key-column name="id" type="integer"/> 
    </primary-key> 
</table> 

<table name="country" schema="public"> 
    <foreign-key constraint-name="country_capital_fkey" foreign-schema="public"> 
     <many-to-one property="capital" exclude="false"/> 
     <set exclude="true" /> 
    </foreign-key> 
</table> 

您還可以在這裏泊塢窗取我的樣本數據庫的實例:

搬運工拉ghusta/Postgres的世界-DB:2.1