背景
我一直在研究一种应该与遗留应用程序配合使用的工具,而且我已经打了一个小砖墙。我花了最后一天左右的时间寻找线索,但我没有运气。
我正在尝试映射表和多个其他表之间的关系,如下所示:
父表表示“字典”。此字典是可以在(可怕的)遗留应用程序中的ad-hoc记录查询中使用的所有数据库字段的列表。每条记录包含可以找到项目的表和列,唯一标识“友好”名称,用于全局值查找表的键,以及确定如何提取这些查找值的标志,以及定义的文本列如果正确设置标志值,则运行SQL以获取查找数据。表名是[字典](表格结构如下所示。)
该标志可以有四个值之一:
如果该标志设置为FREEFORM,则最终用户可以输入他们想要的任何值。如果是任何其他值,则必须从列表中选择一个值,如下所示:
表格结构
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 :(得分:0)
您可以通过使用子类策略来实现此目的。因此,您的查找可以从名为Lookup的抽象类继承,您可以使用table per concrete class strategy进行映射。然后,您的字典对象可以使用适当的密钥创建一组Lookup。
由于您的复杂提取策略,您可能需要为每个查找实现某种custom loader。需要注意的是,此加载程序仅用于加载提取。如果要针对这些查找编写HQL或条件查询,它将违反表和映射。但是,希望你不需要这样做。