簡體   English   中英

在NHibernate中使用級聯

[英]Using cascade in NHibernate

我有兩個類,分別稱為“猴子”和“香蕉”,具有一對多的雙向關系。

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

當我運行這段代碼時,我希望猴子和香蕉都能夠持久存在。 但是,僅當我顯式保存猴子時才持久,反之亦然。 最初,這是有道理的,因為只有我的Monkey.hbm.xml有了一個帶有Karls 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錯誤。 我調查了此錯誤並找到了這篇文章 ,但是我仍然看不到我在做什么錯。 據我所知,我在每邊都映射了一次關系。 為了完全公開,這是兩個映射文件:

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>

由於您的映射,參數索引超出范圍錯誤。 您已將ID映射為關系中的主鍵和外鍵。

子映射(香蕉)不需要具有級聯屬性。 如果刪除了一個香蕉,則猴子可能仍然具有其他香蕉,但是當猴子更改后,其所有香蕉都應進行相應更改,因此只有猴子需要具有層疊屬性

供以后參考,您還應該包括數據庫模式以解決此類問題,因為在不知道模式的情況下很難驗證映射文件。

我的猜測是您搞砸了外鍵。 您說該關系是一對多的,所以這意味着香蕉對猴子表有外鍵,對嗎? 該外鍵列的標准命名為MonkeyID,這就是您的映射中似乎缺少的名稱-您所有的列名似乎都是ID。 James Ide在相似的行上回答,然后您說:“ Id是兩個表中主鍵列的名稱。我的關系映射應該是什么樣?” -確實,主鍵列的名稱在兩個表中都為Id很好,但這仍未描述該關系 如上所述,您需要一個外鍵來建立關系。

解決關系后,您應該發現級聯問題會自動解決。 人們通常希望從級聯中刪除級聯的行為是從父級到子級刪除,反之亦然,在這種情況下,您可能希望在多對一元素上級聯“保存更新”而不是級聯= “所有”。

最后,作為一個無恥的插件,您是否考慮過嘗試Fluent NHibernate 您可能會發現它比hbm xml語法更容易學習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM