2011-02-04 45 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