2011-03-09 20 views
5


Eclipse(Helios)でHibernateツール3.40を使用しています。 EJB3スタイル(JPA2.0アノテーション)で私のDB(MSSQL 2008)からPOJOを生成しようとしています。
私はABの2つのテーブルを持ち、AからBまでの外部キーがあるとします。
Bをメンバー(その親)として持つPOJOとBをPOJOとし、Set<A>をメンバー(「子」)としたAのPOJOをデフォルトで生成します。
リバースエンジニアリングをどのように制御して、アソシエーションの片側のみが作成されるようにしたいのですが(基本的に3つのオプションがすべて重要です)
私は注釈とJPA2.0で働いているとしてファイルをのhbm.xml使用したくないが、私が試したハイバネートツールとの多対1方向の関連付けのリバースエンジニアリングの問題

私はhibernae.reveng.xmlを経由して休止状態にリバースエンジニアリングプロセスにいくつかのメタデータを指定することができますforeign-key属性を設定し、そこにexclude=trueを定義しましたが、1つのシナリオでは半分の答えしか得られませんでした。これにより、A POJOが許容され、理解可能なbPK intメンバーで生成されました。しかしBの生成POJOは、one-to-manyアノテーションが無効な属性を持つためコンパイルされません。 Aにrevengを冬眠させるプロパティがなくなったためにmappedby="unresolved"に戻ることができます。

私は現在、一方向の関連付けを作成できませんし、何か助けていただければ幸いです。

答えて

3

Hibernate Code Generation Configuration

例でreveng. strategyのためのクラスを作成します:別のメソッド呼び出しをする方法excludeForeignKeyAsCollection

Should this foreignkey be excluded as a oneToMany 

ため

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; 
    } 
} 

Javadocをしてもそこに持ってexcludeForeignKeyAsManytoOne

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

おかげで多くのことを。私は、これを行うためのよりよい方法が、「あいまいな」クラスでこれらの要件をハードコードするよりも、少なくとも実用的な解決策であることを望みます。 – Ittai

+0

私は同じ問題を抱えていますが、あなたの答えは "___"に固有のものです。一般的な答えではありません。とにかくありがとう – Kummo

0

現在、(Hibernate Tools 5.2でテストされた)、単方向の多対1の作業を生成します。ドキュメント(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

関連する問題