2011-02-04 81 views
0

背景NHibernate的映射與許多來自多個來源

我一直在努力了應該在與傳統的應用程序一起選擇工作的工具,我已經打了一個一對多的關係小磚牆。我花了最後一天左右爲此尋找線索,但我沒有運氣。

我想如下映射表和多個其他表之間的關係:

父表表示「字典」。該字典是可用於(糟糕的)遺留應用程序中的臨時記錄查詢中的所有數據庫字段的列表。每條記錄都包含可找到項目的表和列,唯一標識「友好」名稱,全局值查找表中使用的鍵以及確定如何抽取這些查找值的標誌,以及定義文本列SQL運行以獲取查找數據,如果標誌值設置得當。表名是[辭典](參見下面的表結構。)

該標誌可以具有以下四個值之一:

  • FREEFORM
  • STANDARD
  • SYSTEM
  • DYNAMIC

如果該標誌設置爲FREEFORM,則最終用戶可以輸入他們想要的任何值。如果它是任何其他值,那麼值必須從列表如下選擇的是:

  1. 標準:將遺留應用程序從一個「UNION ALL」拉的所有值兩個表的查詢的唯一區別是,一張表是基於財政年度的,另一張是「全球」價值表。這些表格包含所有「標準」標記的字典記錄的所有查找值。這兩個表分別稱爲[fy_lookup_values]和[lookup_values](請參閱下面的表結構)
  2. SYSTEM:如果字典表中的友好名稱是「狀態」,則它將拉出所有[狀態]表;如果是國家,則對[國家/地區]表格執行相同的操作(請參閱下面的表格結構)
  3. DYNAMIC:根據上述字典表中動態SQL字段的查詢填充查找值。這些查詢不會使用與上面其他兩種查找類型的列名稱類似的名稱來對所選列進行別名。我將提供下面這些查詢中使用的許多表格之一的示例。

表結構

Table [dictionary] 
    token int not null identity primary key 
    name varchar(10) not null 
    table_name varchar(50) not null 
    column_name varchar(30) not null 
    lookup_key varchar(10) not null 
    lookup_type varchar(8) not null 
    query_text text 

Table [lookup_values] 
    lookup_key varchar(10) not null primary key 
    lookup_value varchar(20) not null primary key 
    lookup_description text not null 

Table [fy_lookup_values] 
    lookup_key varchar(10) not null primary key 
    lookup_value varchar(20) not null primary key 
    lookup_description text not null 
    fy_year_token int not null 

Table [state] 
    state_code varchar(4) not null primary key 
    state_name varchar(30) not null 

Table [country] 
    country_code varchar(4) not null primary key 
    country_name varchar(50) not null 

Table [banks] 
    bank_token int not null identity primary key 
    bank_name varchar(50) not null 

所有應用程序中的抓鬥兩列,一代碼和描述查找值retreivals的。遺留應用程序目前基於列位置而不是名稱來處理所有傳入數據。

我無法觸及數據庫結構(即使添加存儲過程),也無法更改查找的方式,因爲這些都是由一些傳統應用程序使用的,任何更改都會使管理非常不快。我希望我能這樣做,因爲這只是讓我的頭髮變灰的許多事情之一。所以...

我想我的主要問題是,如果有可能用NHibernate以這種方式映射這些數據,那麼當我抓取一個字典項目時,它的查找值會填充在我的?如果可能的話,怎麼樣?我知道,如果所有查找都以相同的方式完成,我可以,但我甚至不知道是否可以根據外部獲取的查詢進行映射。

我希望這是有道理的,因爲它花了我一段時間才圍繞它圍繞我的大腦。

編輯 下面是我想要完成的一些例子。

我們在[字典表以下記錄:

token, name  , table_name, column_name, lookup_key, lookup_type, query_text 
1 , gender , customer , gender  , gender , STANDARD , NULL 
2 , addr_st , customer , addr_st , state  , SYSTEM  , NULL 
3 , acct_type, cust_accts, type_code , acct_type , DYNAMIC , select type_code, descr from acct_types where active = 1 

所以,在傳統應用中,當他們得到拉昇,這裏是執行拉起查找值SQL。

性別:

select lookup_value, 
     lookup_description 
from lookup_values 
union all 
select lookup_value, 
     lookup_description 
from lookup_values 
where fy_year_token = @P1 

地址州:

select state_code, 
     state_name 
from state 

帳戶類型:

select type_code, 
     descr 
from acct_types 
where active = 1 

回答

0

您可以通過使用一個子類策略來做到這一點。因此,您的查找可以從稱爲Lookup的抽象類繼承,您可以使用table per concrete class strategy進行映射。然後,您的字典對象可以使用適當的鍵具有一組查找。

由於您的複雜抓取策略,您可能需要爲每個查找實施某種custom loader。需要注意的是,這個加載器僅用於加載讀取。如果您想針對這些查找編寫HQL或條件查詢,它將違背表和映射。但是,希望你不需要那樣做。

+0

謝謝你的回覆。我曾看過各種子類策略,但從我讀的內容來看,它要求包含區分信息的表代表父類。就我而言,這是不可能發生的,我不認爲這是可行的,因爲歧視性信息完全基於另一類。也許我的帖子有點混亂。我將添加一些示例記錄以幫助澄清。 – 2011-02-04 18:27:27