2008-11-11 79 views
6

我對NHibernate相對比較陌生,但一直在使用它的最後幾個程序,我戀愛了。我遇到了需要將4-5個數據庫中的數據彙總到一個數據庫中的情況。具體是序列號數據。每個數據庫都有自己的映射文件,但最終實體都共享相同的基本結構(串行類)。我知道NHibernate想要每個類的映射,所以我最初的想法是有一個基本的串行類,然後從它繼承每個不同的數據庫,並創建一個唯一的映射文件(繼承類將有零內容)。這對抓取所有數據和填充對象應該很有用。然後我想要做的就是使用基類映射將這些繼承的類保存到基類表中(不確定適當的術語是什麼)。NHibernate:一個基類,幾個映射

問題是我不知道如何強制NHIbernate使用對象的特定映射文件。在使用'session.save()'(它抱怨沒有映射)時,將繼承的類轉換爲基類不會執行任何操作。

有沒有明確指定要使用哪個映射的方法?還是隻有一些OOP主體我失蹤,更具體地將繼承類轉換爲基類?或者這個想法不好。

關於NHibernate(第8章),我可以找到的所有繼承東西似乎都不適用於此函數,但我可能是錯的(每個具體類的表看起來可能很有用,但是我無法將它的頭圍繞在NHibernate的計算結果中)。

回答

4

我不知道這是否會有所幫助,但基本上我不會這麼做。基本上,我認爲你可能患有「戈爾德錘子」綜合徵:當你有一個真正很好的錘子(即休眠(和我分享你的意見;它是一個MAGNIFICENT工具)),一切看起來像釘子。我一般會嘗試簡單地有一個「手動轉換」類,即一個具有構造函數的構造函數,這些構造函數爲您的各個串行類使用hibernate類,並簡單地將數據複製到它自己的特定格式;那麼Hibernate可以簡單地使用自己的映射將其序列化到(單個)數據庫。

實際上,我認爲這是一個更好的解決方案的原因是,你有效地試圖做的是在你的班級中有不對稱序列化;即從派生類中的一個數據庫中讀取數據,然後寫入基類中的另一個數據庫。沒有什麼太可怕的,真的,除了它基本上是一個單向的過程;如果您真的想從一個數據庫轉換到另一個數據庫,只需執行轉換,然後解決它。

+0

是的,我同意,這是有道理的。我希望得到一顆銀彈,但你提到的將會完美地工作。 – anonymous 2008-11-12 03:22:16

2

這可能有幫助;

Using NHibernate with Multiple Databases

來自文章;

介紹

... 使用NHibernate與ASP.NET 描述;它提供了與單個數據庫進行通信的指導方針 。 但有時需要 與多個數據庫 同時通信。對於NHibernate做 這個,會話工廠需要存在 爲每個數據庫,你將與 通信。但是,如同經常有多個數據庫的情況下 的數據庫很少使用。所以 它可能是一個好主意,不建立 會話工廠,直到他們實際上需要 。本文摘自 ,其中前面的NHibernate帶有 的ASP.NET文章,並且描述了 這個 簡單聲音方法的實現細節。雖然前面的文章 關注ASP.NET, ,但ASP.NET和.NET的 均支持以下建議。

...

使用多個數據庫 時做的第一件事就是 配置適當的通信。 爲每個 數據庫創建一個單獨的配置文件,將它們全部放入中心 config文件夾,然後從web/app.config中引用它們 。

...

0

我不是100%肯定這會做什麼,我需要,但我發現這個谷歌搜索今天關於NHibernate和匿名類型:

http://infozerk.com/averyblog/refactoring-using-object-constructors-in-hql-with-nhibernate/

的有趣的部分(對我來說,我是新手)是HQL select子句中的'new'關鍵字。所以我可以做的是使用mappingX從DatabaseX中選擇SerialX,並將其傳遞給SerialY(通用/基本串行)的構造函數。所以現在我從mappingX/databaseX生成了SerialY,並且(希望)我可以使用session.save,並且NHibernate將使用mappingY/databaseY。

我喜歡這個的原因是根本沒有兩個具有相同數據的類持久化(我想!)。這與真正沒有功能差異,並返回一個SerialX列表,迭代併產生SerialY並將其添加到一個新的列表(第一個和最好的答案給出)。

這並沒有爲繼承的NHibernate映射提供有用的案例更普遍的好處,但我認爲它會做我想要的有限的東西。

0

雖然這是真的,但您需要每個表的映射文件/類,但沒有任何東西阻止您讓所有這些類實現通用接口。

然後,您可以聚集所有這些彙集成一個單一的集合在應用程序層(即目錄),其中每個這些類的實現List)

你可能會寫一些管道跟蹤哪個會話,就可以如果您希望更新,請將其存儲在(因爲您要定位多個數據庫)。但是,這樣做的過程會因您設置的方式而有所不同。

0

我寫了一個非常長的帖子,裏面有代碼和所有對Dan的迴應。它結束了,我想我錯過了顯而易見的。

public class Serial 
{ 
    public string SerialNumber {get; set;} 
    public string ItemNumber {get; set;} 
    public string OrderNumber {get; set;} 
} 

...

Serial serial = sessionX.get(typeof(Serial), someID); 
sessionY.save(serial); 

NHibernate的應該使用mappingX爲get和mappingY的保存,因爲會話沒有被共享,並且映射是聯繫在一起的會話。所以我可以有2個映射指向同一個類,因爲在任何特定的會話中,只有一個到類關係的映射。

至少我認爲是這樣(不能測試atm)。

不幸的是,這個具體案例真的很無聊,沒用。在同一個域中的不同程序中,我從業務邏輯的特定部分的基類中派生出來。我不想創建映射文件,因爲它只是簡化一小段代碼。無論如何,由於與我的第一個問題相同的原因,我無法在NHibernate中工作,並且確實採用了McWafflestix描述的解決方法(因爲它很小)。

這就是說我已經通過谷歌發現這一點:

http://jira.nhibernate.org/browse/NH-662

這是完全一樣的情況下,它似乎(可能)在NH 2.1+解決?我還沒有跟進。我注意到你對接口的建議,因爲我認爲這是其他情況的一個好主意,你會定義一個接口嗎?對接口的映射?如果我嘗試並保存一個實現了沒有映射定義的接口的類,NHibernate會使用接口映射嗎?或者我必須在映射中爲每個實現了這個接口映射的類聲明空sublcasses接口映射?)

相關問題