NHibernate使用點滴

2022-04-06 04:55:54 字數 1221 閱讀 7155

工作需要使用nhibernate,用於比較龐大的關係模型。以下是使用過程中遇到問題的彙總(不斷更新中)。

1. 近日遇到"persistence context reported no row snapshot for (某個entity)"問題,通過反覆分析,發現其原因是對應entity有乙個以one-to-many聯絡之的owner沒有儲存(map和persist)。而且這個owner是從乙個abstract class繼承下來,這個class被標記了persist並被我做的拾取器收到並儲存,而這個entity對應的類(擴充套件了這個abstract class)沒有儲存到資料庫(儘管在這個例子中,擴充套件類沒有任何額外資料成員,但在關聯式資料庫模型中也沒有它的位置標識,就像在物件導向模型中也沒了相應的位置),由此發生了懸空的引用,因此出現了這個問題(雖然錯誤提示資訊很難聯想到這個問題,而且搜尋網上可以發現結果多數為nhibernate源**頁,而且看這些源**耗時很大,幫助也不太大)。

2. nhibernate產生schema的功能很強大好用,但乙個問題是它把所有可能的依賴關係都加到關聯式資料庫中成為約束(constraints),而在具體資料庫訪問中,oo側的流程或nhibernate本身的操作都無法保證在能滿足這個約束在資料建立過程中都得到滿足,尤其對於比較複雜的關係模型。因此一般尤其在實驗階段最好約束全部去除(如果業務規則不需要資料庫維護這種關係約束,那就盡量不用),最簡單的是用stored procedure,這可以在網上搜尋到示例**,比較方便。(後發現,通常只要oo測基本保證物件關係的正確性和一致性,這個約束是能夠被遵守的)

3. oo側**產生的id盡量保證為正數,零id很不好,容易發生衝突(零id相當於null)。

4. 一般如果關閉cascade的時候(初創階段,為了方便或效率考慮),儲存和更新要由oo側對相應entity例項定點實施。

5. list方式one-to-many對映不允許reverse,即始終由one側負責讀取(主要原因可能是index的存在)。

6. 能用reverse盡量用reverse,讓many側負責讀取操作,這樣能從優化sql生成減少sql傳送數量角度提高效率(需要eagerloading)。(詳情待整理)

7. 關於lazyloading,對於many-to-one,可以在lazy-load屬性或fluent的lazyload()方法上採用noproxy引數,使得nhibernate不產生proxy以作為區域性載入的多型物件。但這往往有***,會導致執行異常(估計可能是proxy被null取代),有一定的使用注意事項。

(待進一步更新)

NHibernate使用點滴

工作需要使用nhibernate,用於比較龐大的關係模型。以下是使用過程中遇到問題的彙總 不斷更新中 1.近日遇到 persistence context reported no row snapshot for 某個entity 問題,通過反覆分析,發現其原因是對應entity有乙個以one to...

GIT使用點滴

1 轉殖遠端倉庫,git clone x.git localdir 建立本地倉庫 git init 2 獲取遠端 git pull origin master 3 提交所有改動 git add a,快取所有 git commit m 改動說明 到本地倉庫 git push 到遠端倉庫 4 檢視本地版...

mac 使用點滴

一 快捷方式 1.1 通用快捷鍵 1 模擬行首 行尾 cmt 左右鍵 2 截圖 cmd shif 4 3 強制重啟 cmd ctrl power,或者長按power 4 啟動時選擇磁碟 長按option 1.2 finder 快捷鍵 1 檢視簡介或屬性 cmd i 2 查詢 cmd f 3 檢視磁碟...