1
问题场景
系统的数据层采用 Spring.net 框架。
项目对数据的要求
1)每一个业务表的业务信息只能注销,不能物理删除(也就是我们经常说的保存历史数据)
2)不能将表的失效信息暴露在实体类中
2 解决流程
解决的流程
Step one 通过Session中的SessionFactory 查找到业务实体类的ORM信息
在这里,我们最关注ORM信息中的有两点
1) 业务实体类 -------- 数据库中表
2) 业务实体类的主键属性 ---数据库中列信息
补充说明:
在这边我们支持类的映射信息配置的主键主要包含了三个组成方式
1 类的主键类型为复合主键且子主键为key-property
2 类的主键类型为复合主键且子键中包含了key-property 也包含了key-many-to-one
3 类的主键类型直接为property
Step Two 根据ORM信息取对应数据库中表的列对应的业务实体属性值
Step Three 将Step Two 提取出来的的信息转化成我们需要数据格式
属性 属性说明
TableName 表名
IdentifierColumnNames 主键对应数据库表中的列名
identifierValues 业务实体中的主键属性值
KeyNum 主键的列数目
Step Four 根据 step three 的信息拼装SQL语句并执行
3类的设计
类图
3.1 ClassMappingInfo 类
功能说明:存储了类和数据库表之间的NHibernate配置信息
属性
属性名 |
属性含义 |
属性数据类型 |
TableName |
表名 |
String |
IdentifierColumnNames |
主键列名 |
String[] |
IdentifierValues |
主键对应的对象属性值 |
String[] |
ColumnLength |
主键列的数目 |
Int |
3.2 ClassMappingInfoBuilder类
功能说明:
根据类和Isession来获取ClassMappingInfo
函数
public ClassMappingInfo Get(object obj, ISession session)
参数:
Obj :数据持久类
Session:NHibernate 的Session实例
返回类型 ClassMappingInfo
3.3 DeleteCommandCreater类
功能说明:
根据ClassMappingInfo 映射信息,来生成删除功能的sql语句
函数
public override string GetSqlCommand()
返回类型 string
4 核心代码说明
下面是核心函数
参数接口为 业务实体对象的类型,业务实体对象,spring.net 中的Session对象
实现的功能是:
提取业务实体对象的主键信息(包含实体中主键属性值和数据表中的主键列的信息)


1

2


3

4

5

6

7

8

9

10

11

12

13

14

15



16

17


18

19

20

21

22

23

24

25

26

27

28



29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53



54

55

56

57

58

59

60



61

62

63

64

65



66

67

68

69

70

71

72

73

74



75

76

77

78

79

80

81

82

83



84

85

86

87

88

89

90

91

92

93

94

95
