2011-04-02 7 views
0

「多くの重要な関連付け」と題されたセクションのHibernateによるJava Persistenceの書籍には、親オブジェクト(Item)に関連するエンティティオブジェクト(Bid)のリストが含まれている例があります。この例は、私のエディションの290ページにあります。NHibernateの1対多エンティティマッピング - キー列はNULL可能である必要がありますか?

<hibernate-mapping> 
    <class name="com.shane.Hibernate1.Item" table="Item"> 
    <id name="ItemId" column="ItemId"> 
     <generator class="increment"/> 
    </id> 

    <property name="Synopsis" column="Synopsis"/> 

    <list name="bids" cascade="save-update"> 
     <key column ="ItemId" not-null="true"/> 
     <list-index column="Sequence"/> 
     <one-to-many class="com.shane.Hibernate1.Bid"/> 
    </list>  
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="com.shane.Hibernate1.Bid" table="Bid"> 
    <id name="BidId" column="BidId"> 
     <generator class="increment"/> 
    </id>  
    <property name="synopsis" column="Synopsis"/> 
    </class> 
</hibernate-mapping> 

私はNHibernateは2.1.2.GAと3.1.0.GAの両方で次のことを試みた:NHibernateのは、最初の入札に行を挿入するtrys次いで、最初のアイテムに新しい行を挿入

Item item = new Item(); 
item.setSynopsis("Item 1"); 

Bid bid = new Bid(); 
bid.setSynopsis("Bid1");  
item.getBids().add(bid); 

session.save(item); 

これらの列がNULLではない場合、ItemId列とSequence列は含まれないため、失敗します。これらの列をnullにすると、それを設定するためにBidの更新が行われますが、Nullableにする必要はありません。

私はこれをHibernate 3.1.rc2を使って試してみました。これは挿入を行うと全ての値を提供しますが、それでもなおまだBidテーブルのItemIdとSequenceについては更新しています。

これはNHibernateのバグですか?私はこの種の動作がjavaと.Netバージョンの両方で同じであると期待します。

答えて

0

NHibernateでは、コレクションに外部キーが必要でない場合は、双方向の関係が必要です。ノートの終わりを読むhttp://www.nhforge.org/doc/nh/en/index.html#collections-onetomany

これは確かにNHの最も要求される変更の1つであり、これは必ずしもHibernateの100%には一致しません。それはちょうどそれに基づいています。


更新:この制限は残念ながらlistでそれを行うことは事実上不可能です。

代わりにbagまたはsetを使用し、インデックスを通常のプロパティとしてマッピングします。

+0

あなたが言及した注釈を読んで、もし私のコレクションマッピングがヌル可能なFK列を避けるために二辺形関係の逆終わりでなければならないと私は丁寧に理解しています。しかし、私はリストを望むので、この場合は動作しません。 1対多のエンドは、インデックス列を設定する必要がある値がわからないため、逆にマッピングすることはできません。だからそれはnull可能なFKとインデックスの列を持つことが避けられないように見えます。 – Shane

+0

@Shane:編集を参照してください。 –

0

は、私はこのようなソリューション...

入札入札=新しい入札を()ようです。 session.save(bid);

アイテムアイテム=新しいアイテム();item.getBids()。add(新しい単価(bid.getBidId())); session.save(アイテム)。

ここで、BID()クラスには1つのParameterizedコンストラクタが必要です。

私はアイテムのCLASが一つの基準に多くを持つべきだと思う

0

...それが正常に動作します願っています。だからあなたはItemを保存すべきです。その後、入札で参照を設定し(bit.setItem(item))、入札単価を保存します。

+0

マッピングを双方向にするために多対1のマッピングを持つことができますが、書籍で言及されているように、それを更新するためにはupdate = "false"とinsert = "false" 。しかし、これはちょうどそれがインデックス列の値を知っているので、parantが更新を行うリストマッピングのためのちょうど嬉しさです。もっと実験をした結果、私は(奇妙なことに)私がそれをjava上で動作させることができることを発見しました。しかし、リストマッピングでcasacade = "save-update"を設定しても、NHibernateではまだ動作しません。それに応じて私の質問が変更されます。 – Shane

関連する問題