2009-08-28 4 views
2

同じテーブルにマップされたこれらの2つのクラスを考えてみましょう。 1つはmutable = "false"で読み込み専用です。同じテーブルにマップされた2つのクラス(読み取り専用の1つ)は、正しい順序でなければなりませんか?

<class name="Funder" table="funder"> 
    <id name="id"> 
     <generator class="identity" /> 
    </id> 
    <property name="funder_name" /> 
    <property name="contact_name" /> 
    <property name="addr_line_1" /> 
    <property name="addr_line_2" /> 
    <property name="addr_line_3" /> 
    <property name="city" /> 
    <many-to-one name="state" column="state_id" foreign-key="FK_funder_state_id" fetch="join" /> 
    <property name="zip_code" length="10" /> 
    <property name="phone_number" length="30" /> 

    <property name="create_dt" update="false" not-null="true" /> 
    <many-to-one name="create_by" column="create_by" not-null="true" update="false" foreign-key="FK_funder_create_by" fetch="join" /> 
    <property name="last_update_dt" insert="false" /> 
    <many-to-one name="last_update_by" insert="false" foreign-key="FK_funder_last_update_by" fetch="join" /> 

    </class> 

    <class name="FunderSimple" table="funder" schema-action="none" mutable="false"> 
    <id name="id"> 
     <generator class="identity" /> 
    </id> 
    <property name="funder_name" /> 
    <property name="contact_name" /> 
    <property name="phone_number" /> 
    </class> 

私は私のスキーマをマッピングする資金提供者の前にFunderSimpleマッピングを移動した場合はないは正しく生成しません。私がそれを上に残すと、それは働く。

これは仕様です。 schema-action = "none"がtable_nameに固執し、後で同じテーブルへのマッピングがスキーマを生成しないように見えます。

私はこのようにしています。私は、ファンダーテーブルへの外部キーを持つContractという別のクラスがあるためです。しかし、私は、契約オブジェクトから参照するときに、すべてのファインダ列を必要としません。

<many-to-one name="funder_simple" column="funder_id" foreign-key="FK_contract_funder_id" fetch="join" /> 

FunderSimpleからFunderを継承しません。

外部キーテーブルから列のサブセットのみをフェッチする方法はありますか?外部キーを設定するには、多対1が唯一の方法ですか?そのような状況では、バージョン2.1.0.4000

答えて

2

を用い

は、私の代わりに突起を使用します。 同じテーブルに2つの型をマッピングしたことはありません(継承の理由がない限り)。

だから、私はこのような状況でやっていることは次のとおりです。

はFunderSimpleクラスを作成し、それはNHibernateはで知られているように、それをインポートします。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <import class="MyNamespace.FunderSimple" /> 
</hibernate-mapping> 

あなたはこれをしたら、あなたをICriteria APIを使用してFunderタイプのクエリを作成できますが、NHibernateがFunderSimpleのインスタンスを返すように指定することができます。 このようにすることで、NHibernateは、FunderSimpleクラスのインスタンスを生成するために必要な列のみを取得する簡略化されたSQLクエリを生成するほどスマートです。契約マッピングの観点から、この作業を行う方法、

ICriteria crit = session.CreateCriteria (typeof(Funder)); 
// add some expressions ... 
crit.Add (...); 

// Now, set the projection, and specify that FunderSimple should be returned 
crit.SetProjection (Projections.ProjectionList() 
         .Add (Projections.Property ("Id"), "Id") 
         .Add (Projections.Property ("funder_name"), "funder_name") 
         .Add (Projections.Property ("phone_number"), "phone_number")); 

crit.SetResultTransformer (Transformers.AliasToBean (typeof(FunderSimple))); 

crit.List <FunderSimple>(); 
+0

興味深い...しかし:

この

は次のように行われます。私は多対1を重いFunderオブジェクトに戻して、何とかFunderSimpleをロードするだけにマップしますか? – dotjoe

+1

「Funder」はあなたのエンティティなので、契約は「Funder」との関係を持つ必要があります。 FunderSimpleは、「ファンダーズ」のリストを表示するためのヘルパー/コンテナの一種としてのみ表示されています.FunderSimpleはフルファンダースエンティティを持つ必要はありません。 なぜContractインスタンスを取得するときに 'FunderSimple'インスタンスを取得したいのですか? –

+0

私はFunderの不要な外部キー(create_byやlast_update_byなど)のすべてをStaffテーブルに追加する必要はありません。その結果、Staffテーブルのいくつかのキーの結合が増えます。 FunderSimpleフィールドは、契約に関する限り私が必要とする唯一のフィールドです。契約を取り出すたびに、これらの不要なテーブルに参加することがパフォーマンスを傷つけることはないだろうか。しかし、私はそれを回避し、私が必要とするものだけを照会する方法があることを望んでいました。 – dotjoe

関連する問題