0

沒有爲我們的實體類的一個後續的簡化映射:級聯刪除可選逆加入

<class name="Parent" table="tParent"> 
    <id name="Id"> 
     <column name="ParentId" sql-type="bigint"/> 
     <generator class="native"/> 
    </id> 
    <join table="tOneToOneComponent" optional="true" inverse="true"> 
     <key column="ParentId" on-delete="cascade"/> 
     <property name="Someprop"/> 
    </join> 
    </class> 

基本上,它是一個對一個從關係的另一側的外鍵(這是爲什麼我們設置「反向」)。另外,Parent可能在tOneToOneComponent中沒有任何記錄(所以可選的=「true」)。

我知道,這樣的連接不被推薦,但是我們有一個老大的系統,我們沒有時間去重新設計它。

當Parent被刪除時,我們希望NHibernate刪除相關的tOneToOneComponent。

當然,我們可以級聯SQL服務器上的刪除操作,但是我們需要清除NHibernate緩存以確保tOneToOneComponent不會保留在緩存中的某個位置。

所以我們增加了上刪除=「級聯」的,但現在,當我們刪除父,SQL說:

The DELETE statement conflicted with the REFERENCE constraint 

看來,NHibernate的是試圖以錯誤的順序刪除記錄。

如何告訴NHibernate首先刪除tOneToOneComponent(如果存在),然後才刪除父項?

回答

1

你想要的是默認的行爲,它是由Inverse()指定的,它告訴它它不必刪除其他部分,因爲它擁有自己。要麼擺脫反向()或以另一種方式處理刪除。