我正在使用將字段映射到對象的多對多映射表。NHibernate - 將對象添加到多對多集合時,現有對象被刪除並重新插入
相關DB結構...
對象:表
(PK)的ObjectID
[其餘部分是無關緊要]
字段:表
(PK)fieldId
[其餘的是無關]
ObjectFields:表
(pk)fieldObjectid ( FK)fkObjectId - >對象 (FK)fkFieldId - >字段
我的映射是這樣的:
<bag name="Fields" table="ObjectFields" lazy="true" cascade="all">
<key column="fkObjectId"/>
<many-to-many class="Field" column="fkFieldId" />
</bag>
現在,所有收集操作工作,你所期望的 - 檢索,添加和刪除。但是,發生了一件非常奇怪的事情。如果我添加一個對象到「Fields」集合中,NHibernate會刪除已經存在的內容並重新插入它。
這裏是我的log4net的轉儲: DEBUG NHibernate.SQL [(NULL)] - 選擇this_.objectId爲objectId6_0_,this_.Name爲Name6_0_,this_.Description爲Descript3_6_0_,this_.RootElement爲RootElem4_6_0_,this_.ChildElement作爲ChildEle5_6_0_,this_.ImageUrl as ImageUrl6_0_,this_.hasChildren as hasChild7_6_0_,this_.CreateStamp as CreateSt8_6_0_ FROM Objects this_ WHERE this_.objectId = @ p0; @ p0 = 5 [Type:Int32(0)]
DEBUG NHibernate.SQL [(選擇fields0_.fkObjectId作爲fkObjectId1_,fields0_.fkFieldId作爲fkFieldId1_,inventoryf1_.fieldId作爲fieldId4_0_,inventoryf1_.fieldName作爲fieldName4_0_,inventoryf1_.fieldType作爲fieldType4_0_,inventoryf1_.fieldType作爲fieldType4_0_,inventoryf1_.Required作爲必需4_0_ FROM ObjectFields fields0_左外部連接字段inventoryf1_關於fields0_ .fkFieldId = inventoryf1_.fieldId WH ERE [email protected]; @ p0 = 5 [Type:Int32(0)]
DEBUG NHibernate.SQL [(null)] - 選擇this_.fieldId作爲fieldId4_0_,this_.fieldName作爲fieldName4_0_,this_.fieldType作爲fieldType4_0_ ,this_.Required as Required4_0_ FROM Fields this_ WHERE this_.fieldId = @ p0; @ p0 = 2 [Type:Int32(0)]
DEBUG NHibernate.SQL [(null)] - DELETE FROM ObjectFields WHERE fkObjectId = @ p0; @p0 = 5 [Type:Int32(0)]
DEBUG NHibernate.SQL [(null)] - INSERT INTO ObjectFields(fkObjectId,fkFieldId)VALUES(@ p0,@ p1); @ p0 = 5 [類型:Int32 0)],@ p1 = 1 [Type:Int32(0)]
DEBUG NHibernate.SQL [(null)] - INSERT INTO ObjectFields(fkObjectId,fkFieldId)VALUES(@ p0,@ p1); @ p0 = 5 [類型:Int32(0)],@ p1 = 2 [類型:Int32(0)]
正如您所看到的,它發出刪除語句,然後重新插入。
任何想法如何防止這種情況?
感謝克勞迪奧 - 有道理。那麼問題是,我的映射表有一個主鍵;我怎麼把這個聯繫起來?這與我的課程完全無關,並且實際上「商業邏輯」不需要知道它。 Hibernate可以自動處理它嗎? – Sam 2010-12-01 14:25:15