2009-12-11 69 views
1

我們正在開發一個使用Nhibernate作爲數據訪問層的應用程序。NHibernate和模塊代碼

我正在努力的事情之一是找到一種方法將2個對象映射到同一個表。

我們有一個適合數據輸入的對象,另一個用於更多批處理過程。

該表包含數據條目的所有列和批處理過程的一些附加信息。

當它在一個批處理過程中,我不想加載所有的數據只是一個子集,但我希望能夠更新表中的值。

nhibernate是否支持指向同一個表的多個對象?什麼是允許這個的?

我之前嘗試過,我記得如果你對其中一個對象進行查詢,它會加載兩倍的數量,但我不確定我沒有錯過任何東西。

例如

10的數據輸入對象 + 10批次對象

所以20對象,而不是10

任何人都可以闡明這任何光?

我應該澄清一下,這些對象是2個不同的對象,在我看來,它們在行爲上不應該是多態的。但是,它們確實指向相同的數據庫記錄,更多的是該記錄在應用程序中具有雙重用途,並且爲了邏輯分區,它們應該保持獨立。 (更改一個域對象不應該炸燬其他模塊中的大量屏幕等)。

由於 皮特

+1

我希望它只能在兩張映射到同一個表上。你可以試試這個,並確認這種方法的任何明確的問題? –

+0

約翰,我會再試一次,我敢肯定,我已經嘗試過這一點,但我不確定是否它的行爲作爲從批處理對象繼承的數據輸入對象,我必須仔細檢查,它可能是我的記憶很糟糕! – Peter

回答

1

一個簡單的方法將多個對象映射到相同的表是通過使用一個識別器字段。在表中添加一個額外的列,並讓它包含一個值,將其聲明爲類型「數據輸入」或「批處理」。

您會創建兩個對象 - 一個用於數據輸入和批處理。我不完全相信你如何制定,在常規NHibernate的XML映射 - 我用的ActiveRecord城堡爲註釋,所以你標記你的對象,像這樣:

[ActiveRecord("[Big Honking Table]", 
    DiscriminatorColumn = "Type", 
    DiscriminatorType = "String", 
    DiscriminatorValue = "Data Entry")] 
public class Data Entry : ActiveRecordBase 
{ 
    //Your stuff here! 
} 

[ActiveRecord("[Big Honking Table]", 
    DiscriminatorColumn = "Type", 
    DiscriminatorType = "String", 
    DiscriminatorValue = "Batch Process")] 
public class Batch Process : ActiveRecordBase 
{ 
    //Also your stuff! 
} 

下面是與NHibernate做它的方式+ Castle ActiveRecord:http://www.castleproject.org/activerecord/documentation/trunk/usersguide/typehierarchy.html 請注意,他們使用父對象 - 我不認爲這是必要的,但我沒有完全按照您描述的方式實現鑑別器列,所以它可能是。

下面是在XML映射:https://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

您還可以通過映射,讓NHibernate的知道哪些列裝載/更新 - 如果你最終只是讓一個大的對象。

+0

如果它們不是數據庫中的相同記錄,則這將起作用,但是這兩個對象將使用相同的記錄,只是有效地使用兩種模式。 我以前用過其他多態行爲的描述符,這只是不符合多態類的行爲。 這些是兩個獨立的類,它們是db中的相同記錄,它們可能有3個屬性/列彼此相同。 – Peter

+0

我更新了原來的帖子,以包含這些額外的信息,我沒有在第一篇文章中解釋清楚。 – Peter

+0

啊,好吧。我會同意上面John的評論,然後 - 只是將兩個不同的對象映射到同一個表,並且只包含某些列 - 而不是另一個的子類。 –

0

我想你也許會被過度設計,它只是一點點:

  • 如果你擔心性能,這是不成熟的優化(此外,檢索少列是快不了多少,爲節約您可以啓用動態更新僅更新已更改的列)。
  • 如果你試圖通過鎖定他的選擇來保護程序員免受自己的傷害,那麼你的設計就不那麼高尚了。

總之,根據我10年以上的經驗和對您的問題的瞭解有限,我建議您再想一想做你想做的事情。

+0

感謝您的意見,但我不覺得我在過度設計這一點,因爲性能不僅要考慮速度,還要考慮傳輸時間,消耗的內存量,爲什麼要讀取15當你需要時將字符串轉換成內存。 我不想鎖定選擇我試圖確保應用程序是模塊化的,因爲一些要求意味着我們的客戶希望重新編寫部分以使它們工作到他們的工作流程等 – Peter