2009-07-21 82 views
0

我有一個使用關聯表和cascade =「save-update」的兩個實體之間定義的多對多關係。NHibernate額外更新查詢運行

實體1包含實體2的列表,相反,實體2包含實體1的列表。從這個worflow輸出的SQL似乎確定...

  1. 創建ENTITY1和ENTITY2對象
  2. 添加到ENTITY2名單上ENTITY1
  3. 呼叫session.Save上ENTITY1

- >插入語句針對兩個實體運行,然後插入關聯表中的記錄將它們鏈接在一起。

但是,如果ENTITY2我第一呼叫session.Save,將其添加到列表中,然後調用session.Save上ENTITY1還有一個額外的UPDATE語句運行其將所有ENTITY2的價值觀,以完全一樣的東西被插入在開始處。

雖然不會引起任何問題,但它是一種額外的查詢降低性能。我玩過逆向屬性,但這並不能消除額外的更新語句。目前雙方都有inverse =「false」,因爲無論保存哪個實體,我都希望更新關聯表。

任何想法?

回答

0

感謝您的迴應,但我相信我發現了這個問題。我爲每種執行CRUD操作的實體都有一個存儲庫類。每個CRUD操作開始它自己的會話/事務,稱爲保存/更新/等,然後關閉事務/會話。

如果我調用session.Save爲Entity2然後session.Save爲Entity1(其中包含Entity2的列表)NH似乎知道它已經在會話中持久Entity2,因此不會嘗試更新記錄。另一方面,如果我爲一個單獨的會話/事務調用session.Save爲Entity2然後session.Save爲Entity1,它希望再次更新Entity2。我是NH新手,所以不確定它如何跟蹤哪些對象需要更新,但它必須在會話之間重置?

有點讓我很好的DDD存儲庫沒有多大用處!也許倉庫應該使用單例會話或類似的東西來避免這個問題?

感謝, 約翰

+0

只記得一個會話不是線程安全的。我認爲大多數人在aspnet中使用'Session-per-request'或者在應用程序中使用'session-per-thread' – 2009-07-21 06:23:04

0

來自文檔: inverse(可選 - 默認爲false):如果啓用,Hibernate不會嘗試插入或更新由此連接定義的屬性。

我的建議是:在某些情況下,以防止2路附加更新加入兩個集合可能需要更新:

Contact c; 
Address a;  
c.Addresses.Add(a); 
a.Contacts.Add(c); 

你可能會得到額外的更新語句,因爲雙方都有逆=假並且第一個實體的關係列表被保存爲空。新罕布什爾州只做它認爲需要的東西,以便更新所有關係。