2011-01-16 16 views
2

私は2つのクラスを持っています。モンキーとバナナは1対多の双方向関係です。NHibernateでのカスケードの使用

Monkey monkey = new Monkey(); 
Banana banana = new Banana(); 
monkey.Bananas.Add(banana); 
banana.Monkey = monkey; 
hibernateService.Save(banana); 

私はこのコードを実行すると、猿とバナナの両方を永続させたいと思っています。しかし、それは私が明示的に猿を保存したときとそうでないときの両方で持続しているだけです。最初は、私のMonkey.hbm.xmlだけがcascade="all"とのマッピングを持っていたので、これは意味がありました。

<set name="Bananas" inverse="true" cascade="all"> 
    <key column="Id"/> 
    <one-to-many class="Banana"/> 
</set> 

私はちょうど私のBanana.hbm.xmlファイルに以下を追加する必要考え出し:私は、コードのスニペットを実行しようとしたとき

<many-to-one name="Monkey" column="Id" cascade="all" /> 

は残念ながら、これはParameter index is out of rangeエラーが発生しました。私はこのエラーを調査し、this postを見つけましたが、私はまだ間違っているのか分かりません。私は、私が知る限り、両側に一度マッピングされた関係を持っています。完全な情報開示のために、ここでは2つのマッピングファイルは、次のとおりです。

Monkey.hbm.xml

<class name="Monkey" table="monkies" lazy="true"> 
    <id name="Id"> 
     <generator class="increment" /> 
    </id> 
    <property name="Name" /> 
    <set name="Bananas" inverse="true" cascade="all"> 
     <key column="Id"/> 
     <one-to-many class="Banana"/> 
    </set> 
</class> 

Banana.hbm.xml

<class name="Banana" table="bananas" lazy="true"> 
    <id name="Id"> 
     <generator class="increment" /> 
    </id> 
    <property name="Name" /> 
    <many-to-one name="Monkey" column="Id" cascade="all" /> 
</class> 

答えて

3

パラメータインデックスが範囲外ですエラーはマッピングによるものです。リレーションシップの主キーと外部キーの両方にマップされたIDがあります。

1

子マッピング(バナナ)が必要カスケード属性を持たない。 1つのバナナが削除されても、モンキーには他のバナナが残っている可能性がありますが、モンキーが変更されると、それに応じてバナナをすべて変更する必要があります。

+0

あなたが言ったことは理にかなっていますが、Banana.hbmからカスケード属性を削除した後でも、パラメータインデックスが範囲外です。 –

1

将来的には、スキーマを知らなくてもマッピングファイルを検証するのが難しいため、このような質問のためにデータベーススキーマも含める必要があります。

私の推測では、あなたの外来キーを台無しにしてしまったと思います。あなたは関係が1対多であると言うので、バナナにはサルのテーブルへの外部キーがあります。正しい?この外部キー列の標準命名はMonkeyIDであり、これはマッピングに欠けているように見えます。すべての列名はIDのようです。 James Ideは同様の行で答えた。「Idは両方のテーブルの主キー列の名前です。関係マッピングはどうすればいいですか? - 確かに、プライマリキー列の名前が両方のテーブルのIdであるとはかなり良いですが、まだの関係は記述されていません。上で述べたように、関係のためには外部キーが必要です。

カスケードの問題は、関係を修正するとそれ自体がソートされることがわかります。カスケードから通常必要とされる動作は、親から子への削除をカスケードすることですが、その逆もありません。カスケードではなく多対1の要素にcascade = "save-update" = "すべて"。

最後に、恥知らずなプラグとして、Fluent NHibernateを試してみましたか?おそらくhbm xmlの構文よりも簡単に学ぶことができます。

+0

実際、FKマッピングに問題がありました。私はFluent NHibernateを試したことはありませんが、JavaのJPAアノテーションスタイルのHibernateのようなものなら、一見価値があるかもしれません! –

関連する問題