050简易数据字典的加入和使用
在系统中经常有各种字段属性需要定义,有些重要的属性必须做成一个模块来进行操作,比如对于客户来说,其相对应的市或省信息就要有相应的模块来做ManyToOne的关联。但是有些场合就不需要把属性定义成一个模块,比如说人员的性别,职务,学历等一些选择量比较少的属性,这些属性即可以加在数据字典中供其他模块来使用,只要做好一个操作的引擎即可。
在我的系统中数据字典的设计也比较简单,一共有三个表来维护:数据字典分组、数据字典属性 、和数据字典属性值。下图即为系统中这三个模块的显示和操作的一个界面。
本系统的架构过程中也用到了许多系统组的数据字典的属性来自定义各种显示方式或者操作方式 。比如上图中的“父模块选择方式。举个例子,一个订单在选择客户单位的时候,可以有以上6种方式。客户单位这个模块有一个属性就是父模块选择方式,它定义了某个值之后,以生成form字段的时候就会按照指定的方式来进行选择了。这个下几节会有详细的说明。
下面来看看这三个javabean 的定义。
public class _DictionaryGroup {
@Id
@FieldDefine(title = "分组编码", number = 10, fieldGroup = "基本信息")
@Column(nullable = false, length = 10)
private String tf_groupId;
@FieldDefine(title = "分组名称", nameField = true, number = 20, fieldGroup = "基本信息")
@Column(nullable = false, length = 50, unique = true)
private String tf_title;
@FieldDefine(title = "系统组", number = 50, fieldGroup = "基本信息")
@Column(nullable = false)
private Boolean tf_isSystem = false;
@FieldDefine(title = "图标Cls", number = 60, fieldGroup = "基本信息")
@Column(length = 50)
private String tf_iconCls;
@FieldDefine(title = "备注", number = 90, fieldGroup = "基本信息")
private String tf_remark;}
public class _Dictionary implements _IModuleControlInterface {
@Id
@FieldDefine(title = "属性编码", number = 10, fieldGroup = "基本信息")
@Column(nullable = false, length = 10)
private String tf_dictionaryId;
@FieldDefine(title = "属性名称", nameField = true, number = 20, fieldGroup = "基本信息")
@Column(nullable = false, length = 50)
private String tf_title;
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
@JoinColumn(name = "tf_groupId", nullable = false)
@FieldDefine(title = "属性分组", number = 30, fieldGroup = "基本信息")
private _DictionaryGroup tf_DictionaryGroup;
@FieldDefine(title = "关联主键", number = 50, fieldGroup = "基本信息", remark = "关联此属性的模块字段将保存此属性的主键(可以建立外键)")
@Column(nullable = false)
private Boolean tf_isLinkedKey = false;
@FieldDefine(title = "关联编码", number = 60, fieldGroup = "基本信息", remark = "关联此属性的模块字段将保存此属性值的编码(不能建立外键)")
@Column(nullable = false)
private Boolean tf_isLinkedCode = false;
@FieldDefine(title = "关联文本", number = 70, fieldGroup = "基本信息", remark = "关联此属性的模块字段将保存此属性值的文本(不能建立外键)")
@Column(nullable = false)
private Boolean tf_isLinkedText = false;
@FieldDefine(title = "显示编码文本", number = 80, fieldGroup = "基本信息", remark = "显示文本的时候加上编码")
@Column(nullable = false)
private Boolean tf_isDisplayCodeText = false;
// combo 直接选择;录入code可以直接选择,可以录入关键字查找
@FieldDefine(title = "录入方式", number = 120, fieldGroup = "基本信息")
@Column(length = 10)
private String tf_inputMethod;
@FieldDefine(title = "图标Cls", number = 140, fieldGroup = "基本信息")
@Column(length = 50)
private String tf_iconCls;
@FieldDefine(title = "备注", number = 90, fieldGroup = "基本信息")
private String tf_remark;
@FieldDefine(title = "数据字典属性值", number = 100, fieldGroup = "基本信息")
@OneToMany(targetEntity = _DictionaryDetail.class, fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
@JoinColumn(name = "tf_dictionaryId")
@OrderBy("tf_code")
private List<_DictionaryDetail> tf_DictionaryDetails;
}
在这个类中,录入方式需要在系统中设置为某个数据字典,用来确定当前数据字典属性在被选择的时候是哪个方式。
public class _DictionaryDetail {
public static final String ID = "tf_detailId";
public static final String CODE = "tf_code";
public static final String TITLE = "tf_title";
@Id
@FieldDefine(title = "主键id", number = 10, fieldGroup = "基本信息", hidden = true)
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private Integer tf_detailId;
@FieldDefine(title = "编码", number = 20, fieldGroup = "基本信息")
@Column(nullable = false, length = 10)
private String tf_code;
@FieldDefine(title = "名称", nameField = true, number = 30, fieldGroup = "基本信息")
@Column(nullable = false, length = 50)
private String tf_title;
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
@JoinColumn(name = "tf_dictionaryId", nullable = false)
@FieldDefine(title = "数据字典属性", number = 40, fieldGroup = "基本信息")
private _Dictionary tf_Dictionary;
@FieldDefine(title = "图标Cls", number = 50, fieldGroup = "基本信息")
@Column(length = 50)
private String tf_iconCls;
@FieldDefine(title = "不可用", number = 60, fieldGroup = "基本信息", remark = "在选择属性值的时候不会出现在下拉列表框中")
private Boolean tf_disabled;
@FieldDefine(title = "备注", number = 90, fieldGroup = "基本信息")
private String tf_remark;
}
以上是这三个class的基本定义。这个做好之后,需要给模块字段加一个属性。
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
@JoinColumn(name = "tf_dictionaryId")
@FieldDefine(title = "数据字典属性", number = 425, fieldGroup = "附加信息")
private _Dictionary tf_Dictionary;
这样每个字段都可以链接到一个数据字典的属性上面。选择界面如下:
而选择了一个数据字典属性的字段,在录入的时候就会是这个样子:
一共有三种选择方式,第一种是下拉选择,第二,三种可以录入关键字或者代码来进行选择,即可以快速的通过键盘来进行录入的方式。