「多くの重要な関連付け」と題されたセクションの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バージョンの両方で同じであると期待します。
あなたが言及した注釈を読んで、もし私のコレクションマッピングがヌル可能なFK列を避けるために二辺形関係の逆終わりでなければならないと私は丁寧に理解しています。しかし、私はリストを望むので、この場合は動作しません。 1対多のエンドは、インデックス列を設定する必要がある値がわからないため、逆にマッピングすることはできません。だからそれはnull可能なFKとインデックスの列を持つことが避けられないように見えます。 – Shane
@Shane:編集を参照してください。 –