我認爲透明度比您制定的要求還要多。 我認爲NHibernate與任何ORM都可能是透明的。 我認爲ORM不可能是真正透明的。
當我讀了它,你的「透明」的定義是:
- 不要在你的類來改變代碼,具體...
- ORM需要照顧......
- 從數據庫讀取的類「無縫」
- 持久化類數據庫中的「無縫」
根據這一定義,NHibernate的通過與飛行顏色。 映射存儲在您的域類外部,以便您的域類完全可以忽略這樣一個屬性存儲在哪個特定列中的事實。 你可以選擇來存儲你的班級內的屬性,但你不必。
您不必爲您的域類使用任何特定的基類或接口。 正如Simon Svensson提到的那樣,NHibernate不需要基類,而需要將類的所有成員聲明爲virtual
。 這是需要的,以便NHibernate可以將惰性加載行爲注入到您的類中。
至於ORM無縫閱讀和保持對象,我認爲這是相當無縫,約無縫銜接,我會想:
var customer = session.Get<Customer>(42);
customer.Email = "[email protected]";
customer.Addresses.Remove("Home");
session.SaveOrUpdate(customer);
比任何更完美,我們開始冒險進入令人毛骨悚然的閱讀代碼的土地。
但是,我不認爲上述「透明」的定義是完整的。 我期待一個提供「透明持久性」的ORM,它允許我像在.NET中那樣編寫我的領域類,充分利用不同類型的集合,如詞典和集合,利用繼承和多態性,枚舉等。 我希望能夠操縱多對多的關係,而不必因爲更緊密地模擬關係數據庫的工作方式而被迫通過中間類。 NHibernate也通過了所有這些與飛行顏色。
但這些東西都需要映射。否則,除了將您限制爲最接近表和列的面向對象設計元素的子集之外,別無選擇。 因此,映射所需的事實可能是負數,但它會導致更大的優勢。
我第二次西蒙·斯文森的建議,你再看看流利的NHibernate。 假設您的數據庫模式和對象模型的結構是一致的,合理的,您可以使用FluentNH的Auto Mapping大大減少您必須執行的手動映射的數量,並根據需要僅在某些地方使用override。
至於維基百科是否公平地使用術語「透明」,這聽起來更像是討論Wikipedia Talk page,而不是StackOverflow。 我認爲這是一個close enough description for an encyclopedia。 即使glass isn't 100% transparent,但我們仍然call it transparent。
如果您需要比ORM提供的更多透明度,您可以嘗試查看文檔數據庫。文件與表格中的行相比,具有更大的相似性。
對於選項1)您可以(也可能應該出於優化原因)在單個.hbm.xml文件中包含所有映射。如果你有很多類,所有文件的加載時間可能會相當大。 – dwerner
我希望能夠聽到降薪的理由......這是一個完全合法的問題。 – Ted
也許是因爲這個問題幾乎是一個社論,這是一個問題與答案網站,不鼓勵以意見爲基礎的帖子。原來,標題中出現拼寫錯誤,這也可能導致人們認爲它不像他們所期望的那樣精心構造。 – dwerner