# 元数据管理

# 应用管理

# 概述

应用管理适用于一个系统内包含多个业务子系统的场景。若系统不需要区分子系统,则只创建一个应用来维护所有实体即可。

【应用管理路径:】系统配置化平台 -> 元数据 -> 元数据管理

# 操作

  • 查询:可根据应用名称进行模糊搜索,结果按创建时间倒序排序。
  • 新增:点击左上角新增按钮,弹出新增页面,编辑应用信息后点击保存或保存并设计按钮即可。若点击的是保存并设计按钮,则将自动跳转到实体管理页面。
  • 编辑:点击应用卡片下的编辑按钮,即可对当前应用进行编辑操作
  • 删除:点击应用卡片下的删除按钮,即可对当前应用进行删除操作。

字段名     字段说明
图标 应用图标
应用编码 必填,长度最大为75字符,有唯一性校验,只允许字母、数字以及下划线
应用名称 必填,长度最大为37字符
创建人 长度最大为37字符
版本 长度最大为37字符,目前仅用于版本标识,无其他作用
描述 长度最大为 250 字符

提示
应用下有模块或实体时,不允许删除。必须先删除该应用下的所有模块和实体,才能删除应用。

# 辅助功能

# 模块管理

# 概述

实体管理页面左侧为模块管理功能,模块管理对一个应用内不同的业务类型进行区分。例如:可以为基础平台中的组织人员功能建立一个单独的模块。

【模块路径:】系统配置化平台 -> 元数据 -> 元数据管理 -> 点击一个应用 -> 实体建模 -> 实体管理 ->实体管理左侧为模块列表

# 操作

  • 查询:可根据模块名称进行模糊查询,查询结果按创建时间倒序,id倒序排序。
  • 新增:点击新增模块按钮,弹出新增模块弹窗,填写模块基本信息和表实体配置后,点击保存即可。
  • 编辑:点击需要修改的模块右侧编辑按钮,弹出编辑窗口,即可对模块信息进行修改。
  • 删除:点击需要修改的模块右侧删除按钮,弹出确认弹窗后,点击确认按钮,即可删除模块。

字段名     字段说明
编码 必填,长度最大为75字符,有唯一性校验,只允许字母、数字以及下划线
名称 必填,长度最大为37字符
描述 长度最大为 250 字符
表前缀 长度最大为30字符、只允许字母、数字以及下划线。仅在新建元数据时起到提示作用
实体去除表前缀 长度最大为30字符、只允许字母、数字以及下划线。用于自动生成实体编码时,自动去除部分前缀,只能输入表前缀的子集

提示
模块下有元数据时,不允许删除。必须先删除该模块下的所有元数据,才能删除模块。

# 辅助功能

# 实体管理

# 概述

实体管理功能负责维护表实体的具体信息,包括表的基本信息业务字段信息关联关系系统字段信息索引信息唯一性校验场景支持

【实体管理路径:】系统配置化平台 -> 元数据 -> 元数据管理 -> 点击一个应用 -> 实体建模 ->实体管理 -> 页面右侧为当前模块下的实体列表

# 查询实体

可根据表编码、表名称、实体编码、实体名称分页模糊查询。

# 新增实体

选择需要添加实体的模块,点击新增按钮,即可弹出新增窗口。新增一个实体需要配置多个方面的信息,包括:表的基本信息业务字段信息关联关系系统字段信息索引信息唯一性校验场景支持

  • 右上角按钮可以控制新增窗口的最大化和最小化。
  • 上述所有实体的相关信息,只有点击新增窗口下方保存按钮时,才会保存到数据库中。
  • 实体属性详情如下表,各属性对同步数据库等功能点的影响见属性作用表

# 表的基本信息

字段名 字段说明
表编码 必填,表编码长度最大长度为30,只允许字母、数字以及下划线,表编码模块内唯一,表编码全局唯一
表名称 必填,长度最大为255字符
实体编码 必填,最大长度为75,只允许字母、数字以及下划线
实体名称 必填,最大长度为37字符
继承父模板 需要继承的父模板,下拉选项来自父模板管理
国际化 是否开启国际化,详细信息见场景支持-国际化
国际化翻译表名 国际化信息存储表,详细信息见场景支持-国际化
排序 必填
描述 长度最大为 250 字符
辅助功能 多选,和系统字段联动

提示

是否启用:只在数据库同步和代码生成时生效,停用的实体无法同步到数据库,且无法生成代码。

# 业务字段信息

点击业务字段TAB页签中的新增按钮,即可在行内新增一条业务字段数据。

在批量新增按钮右侧输入框内填入数字N(1<=N<=10)后,点击批量新增按钮,可批量新增N条空行。
点击右侧上下箭头,可修改字段排序。

行内编辑项都为字段的必填项,点击行内数据右侧设置按钮,可设置字段的其他详细信息。

字段名 字段说明
字段表编码 建表时的字段名称。必填,长度最大为 30 字符,只允许小写字母、数字、下划线
字段实体编码 生成代码时的实体类名。必填,长度最大为 30 字符。
字段名称 必填,长度最大为255字符。
字段类型 必填,选项可在数据类型映射 功能中配置
字段长度 必填,默认为0,字段类型的长度可配时,此属性才可编辑
字段标度 即小数位数,必填,默认为0,字段类型的标度可配时,此属性才可编辑
持久化 必填,详细信息参考是否持久化
自增 是:同步到数据库时,给改字段加上自增限制
非空 是:数据库加上必填限制
同步状态 标志此字段最新修改是否已同步到数据库
业务类型 标记此字段的业务类型,详细信息参考业务类型
默认值 创建表时,字段的默认值
最大值 仅数字类型可以配置,配置后将生成校验代码
最小值 仅数字类型可以配置,配置后将生成校验代码
描述 长度最大为 250 字符
是否数据校验 详细信息见数据校验
是否必填 是:代码生成时,将生产必填校验注解@Notnull@NotBlank(默认模板)
国际化 勾选国际化,表示此字段需要进行国际化翻译,详细信息见场景支持-国际化
数据库加解密 勾选数据库加解密,表示此字段需要进行数据库加解密,详细信息见场景支持-数据库加解密
# 是否持久化

若是否持久化选择为否,创建表时,此字段不会被创建。代码生成时,此字段将会被加上非持久化的注解(默认模板)。

    @ApiModelProperty(value = "失败原因")
    @TableField(exist = false)
    private String errorMsg;
# 业务类型

选择了业务类型的字段,在保存数据时将被自动填充对应的业务信息。具体选项及作用如下:

  • 创建人:新增数据时,自动给该属性填充创建人id
  • 创建时间:新增数据时,自动给该属性填充当前时间
  • 更新人:新增和更新数据时,自动给该属性填充更新人id
  • 更新时间:新增和更新数据时,自动给该属性填充当前时间
  • 是否删除:添加逻辑删除注解,新增数据时,自动给该属性填充0
  • 租户id:新增数据时,自动给该属性填充租户id
  • 父主键:实体继承INode接口,实现INode方法;controller生成树形查询接口
  • 祖级类型主键:同时存在父主键和祖级类型主键时,serviceImpl类新增和更新方法添加增强处理代码,给该属性填充祖级类型主键数据

若需要上述自动填充功能生效,项目还需要依赖以下jar包:

    <dependency>
        <groupId>com.mediway.hos</groupId>
        <artifactId>hos-framework-metadata-database-starter</artifactId>
    </dependency>
# 数据校验

数据校验功能用于代码生成时,生成字段的正则表达式校验。将是否数据校验按钮选为是,页面将显示数据校验的配置信息。

用法举例:若要限制字段内容至少为6位数字,则操作步骤如下:
1、左侧选择“至少n位数字”,示例内容将显示校验n位数字的正则表达式。
2、点击右侧应用按钮,示例内容将复制到内容编辑框中。
3、将内容编辑框中的n改为6即可。

配置后,使用默认模板生成的代码效果如下:

    @Pattern(regexp = "^d{6,}$", message = "age:正则校验失败,age字段必须为大于6位的数字!")
    private Integer age;

提示

系统中已经预置了常用的数据校验正则表达式,若想自定义其他表达式,可在数据字典中自行配置。

# 关联关系

实体功能支持给字段配置关联关系,代码生成时,系统将根据实体的关联关系,自动生成关联数据绑定的相关代码。

点击业务字段或系统字段右侧关联字段按钮,即可进入关联关系配置页面。

关联配置页面中,关联关系有四种类型,每种类型需要配置的内容有所差别。

  • 一对一:表示两个实体间的关联关系为1:1。在示例中,人员表和人员信息扩展表通过person_id字段一对一关联,因此应当给person_id字段进行如下图所示的关联配置。

    • 当前表:人员信息扩展表
    • 关联表:人员表

字段名 字段说明
关联配置 必填,有两个输入框,左侧可选择本系统中所有的实体表,选择完成后,右侧可以选择左侧实体表中,所有和当前字段类型相同的字段。在示例中,左侧选择了人员表,则右侧可以选择人员表中,所有和person_id字段类型相同的字段 。
显示字段 有两个输入框,左侧选择关联配置表中的任意字段,右侧填写在当前实体中需要添加的属性名
在关联实体中绑定当前对象 在当前实体中添加一个关联实体的属性。在示例中,表示在人员扩展表中添加一个人员表实体
在当前实体中绑定关联对象 在关联实体中添加一个当前实体的属性。在示例中,表示在人员表中添加一个人员扩展表实体

通过上述配置,使用默认模板最终生成的人员表实体和人员扩展表实体效果如下:

public class SysPerson extends BaseEntity<SysPerson> {
    
        @TableField(exist = false)
        @BindEntity(entity = SysPersonExtend.class, condition = "id = person_id")
        private SysPersonExtend personExtend;
}
public class SysPersonExtend extends BaseEntity<SysPersonExtend> {
    
    @TableField(exist = false)
    @BindField(entity = SysPerson.class, condition = "person_id = id", field = "name")
    private String personName;

    @TableField(exist = false)
    @BindEntity(entity = SysPerson.class, condition = "person_id = id")
    private SysPerson personObj;
}
  • 多对一:表示两个实体间的关联关系为n:1。在示例中,人员教育经历表和人员表通过person_id字段多对一关联,因此应当给person_id字段进行如下图所示的关联配置。

    • 当前表:人员教育经历表
    • 关联表:人员表

配置内容与一对一的类型相同,使用默认模板最终生成的人员表实体和人员教育经历表实体效果如下:

public class SysPerson extends BaseEntity<SysPerson> {
    
    @TableField(exist = false)
    @BindEntityList(entity = SysPersonEdu.class, condition = "id = person_id")
    private List<SysPersonEdu> eduList;
}
public class SysPersonEdu extends BaseEntity<SysPersonEdu> {
        @TableField(exist = false)
        @BindField(entity = SysPerson.class, condition = "person_id = id", field = "name")
        private String personName;
}
  • 多对多:表示两个实体间的关联关系为n:n。在示例中,菜单表和人员表通过中间表多对多关联,因此应当给人员表的主键id字段进行如下图所示的关联配置。

    • 当前表:人员表
    • 关联表:菜单表
    • 中间表:人员菜单权限表

字段名 字段说明
关联配置 必填,有两个输入框,左侧可选择本系统中所有的实体表,选择完成后,右侧可以选择左侧实体表中,所有和当前字段类型相同的字段。在示例中,左侧选择了菜单表,则右侧可以选择菜单表中,所有和人员表的id字段类型相同的字段 。
中间表配置 必填,选择将当前表和关联表联系起来的中间表
当前字段对应的中间表字段 选择当前字段关联的中间表字段。在示例中,当前字段是人员表的主键id,它关联的中间表字段是person_id
关联表字段对应的中间表字段 选择关联表字段关联的中间表字段。在示例中,关联表字段是菜单表的主键id,它关联的中间表字段是menu_id

通过上述配置,使用默认模板最终生成的人员表实体效果如下:

public class SysPerson extends BaseEntity<SysPerson> {
    
    //添加此字段后,查询人员时,可同时查询出改人员被授权的菜单列表
    @TableField(exist = false)
    @BindMiddleEntityList(entity = SysMenu.class, condition = "menu_id = id", middleEntity = SysPersonMenu.class, middleCondition = "id = person_id")
    private List<SysMenu> menuList;
}
  • :若想删除配置好的关联关系,则将关联关系改为无即可。

# 系统字段信息

主要包括父模板字段和辅助功能,系统字段也能配置成主键,能配置关联关系。

  • 父模板字段:若在基础信息中选择了父模板,则将在系统字段TAB页签展示父模板中的字段信息

  • 多租户字段:在辅助功能上勾选多租户,系统字段将自动添加租户id字段

# 索引信息

新增实体页面切换到索引Tab页签,点击新增按钮,即可弹出添加索引弹窗。

在新增索引弹窗中,选择需要添加索引的字段(可选择多个字段,支持联合索引),并填写索引的相关信息后,点击保存即可。

字段名 字段说明
索引编码 必填,全局唯一,只允许小写字母、数字、下划线;最大长度为30
索引名称 必填,长度最大为37字符
索引类型 必填,索引类型支持普通索引、唯一索引两种。
索引描述 长度最大为250字符
字段列表 必填,可选多个字段,可调节字段顺序,一个索引最多能勾选9个字段

提示

编辑实体时,若删除了某个字段,其绑定的索引也会被自动删除。

# 约束信息

新增实体页面切换到约束Tab页签,点击新增按钮,即可弹出添加约束弹窗。
在新增约束弹窗中,选择需要添加约束的字段(可选择多个字段),并填写约束的相关信息后,点击保存即可。

字段名 字段说明
约束编码 必填,全局唯一,只允许小写字母、数字、下划线;最大长度为30
约束类型 必填,主键约束/唯一约束,详见约束类型
主键生成策略 类型为主键约束时可填,详见主键生成策略
约束描述 长度最大为250字符
字段列表 必填,可选多个字段,可调节字段顺序,一个约束最多能勾选9个字段
# 约束类型
  • 主键约束:即添加主键字段,只选择一个字段时为唯一主键,选择多个字段时为联合主键
  • 唯一约束:即添加唯一约束,在同步到数据库时,将生成对应的约束信息
# 主键生成策略

主键生成策略主要用于代码生成时,继承不同的父类,以使用不同的策略生成主键。主要有以下三种策略:

  • 程序生成的无序的UUID:使用mybatis-plus注解,生成字符串类型的32位无序UUID
    @ApiModelProperty(value = "主键", dataType = "String")
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private String id;
  • 数据库自增Long型ID:依赖数据库,生成自增的Long型ID
    @ApiModelProperty(value = "主键", dataType = "Long")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
  • 雪花算法Long型ID:使用mybatis-plus注解,使用雪花算法,生成有序的Long型ID
    @ApiModelProperty(value = "主键", dataType = "Long")
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;

# 唯一性校验

新增实体页面切换到唯一性校验Tab页签,点击新增按钮,即可弹出添加唯一性校验弹窗。

在新增唯一性校验弹窗中,选择需要添加唯一性校验的字段(可选择多个字段,支持联合唯一校验), 并填写唯一性校验的相关信息后,点击保存即可。代码生成时,将会生成相应的校验代码。

  • 一个唯一性校验最多能勾选9个字段

字段名 字段说明
规则编码 必填,只允许小写字母、数字、下划线;最大长度为30
规则名称 必填,长度最大为37字符
规则描述 长度最大为250字符
字段列表 必填,长度最大为300字符

# 场景支持-国际化

# 国际化配置

对象建模中,国际化需要在以下三处进行相关配置:
1、国际化开关表的基本信息中的国际化开关决定此表相关的查询接口返回结果时是否做国际化翻译。 2、国际化翻译表名表的基本信息中的国际化翻译表名,用于自定义该表的翻译数据存储在哪个表,此属性不配置时,默认为hos_i18n_data

3、配置实体中具体哪些字段需要翻译,可以通过以下两处配置:

  • (1) 选择需要国际化翻译的字段,点击详情配置按钮,切换到场景TAB页签,勾选国际化选项.

  • 选择场景支持标签,勾选需要翻译的字段

代码生成时,配置了国际化的字段,将生成如下所示代码:

  • 对应字段生成翻译注解(默认模板)
    @HosI18nAutoTrans(tableName = "t_app_person", i18nDataTable = "hos_i18n_person_data")
    private String name;
  • 数据的增删改方法内生成国际化数据增删改逻辑(默认模板)
    protected void addOrUpdate(TAppPerson record) {
        if (!HosI18nUtil.isOpenI18n()) {
            return;
        }
        if(CollectionUtil.isEmpty(TAPPPERSON_TABLE_FIELD_I18N)){
            return;
        }
        List<I18nDataManual> i18nDataManuals = new ArrayList<>();
        for (String fieldName : TAPPPERSON_TABLE_FIELD_I18N) {
            try{
                String value = BeanUtils.getProperty(record, StrUtil.toCamelCase(fieldName));
                if (CommonUtils.isNotEmpty(value)) {
                    i18nDataManuals.add(new I18nDataManual(record.getId(), TAPPPERSON_TABLE_NAME,
                    fieldName, value));
                }
            } catch (Exception e) {
                log.error("saveI18nTrans create i18nDataManual error. TAppPerson:{}", record, e);
            }
        }
        HosI18nUtil.saveBatchTransValue(i18nDataManuals);
    }

# 国际化表结构管理数据迁移

若国际化管理-表结构管理中的数据需要迁移到实体管理中维护,可以调用以下接口:{后端ip:port}/api/metadata/table/moveOldI18nStructure

# 场景支持-数据库加解密

对于需要进行数据库加解密的字段,可在场景支持或字段详细配置中勾选数据库加解密选项:

代码生成时,对应字段将加上数据库加解密注解(默认模板):

    @ApiModelProperty(value = "编码")
    @TableField(value = "code", typeHandler = DataBaseEncryptTypeHandler.class)
    private String code;

# 编辑实体

点击需要修改的实体右侧编辑按钮,即可对实体进行编辑。

# 编辑规则

修改实体时,系统有以下几条规则:

  • 数据库同步时,若因数据库的限制同步失败,系统会将数据库的报错信息提示到页面中,用户根据异常信息自行修改。
  • 同步状态变化:
    • 修改以下字段会导致表的同步状态变为未同步:表编码、表名称、继承父模板、辅助功能、删除继承父模板、删除业务字段、删除索引、删除约束、业务字段、系统字段、索引状态或约束状态变为未同步时
    • 修改以下字段属性会导致字段的同步状态变为未同步:字段表编码、字段名称、字段类型、字段长度、默认值、小数位数、是否自增
    • 修改以下索引属性会导致索引的同步状态变为未同步:索引编码、索引字段、索引类型
    • 修改以下约束属性会导致约束的同步状态变为未同步:约束编码、约束字段、约束类型

# 删除字段

点击需要删除的字段右侧删除按钮,即可删除该字段。


注意

若删除的字段被其他字段关联,则不允许删除,需要将关联关系改为无后,才能删除。

  • 若该字段还未入库,将被直接删除
  • 若该字段已经入库,删除前将提示,此字段将移入已删除字段TAB页签中。

在已删除字段TAB页签中,点击右侧恢复按钮,可将此字段恢复。


注意

1、系统字段恢复后将变为业务字段
2、数据库同步之后,此字段将在实体和数据库中真正的被删除,无法再恢复!

# 删除实体


重要提示

删除实体时,除了会删除实体记录之外,还会立即删除实体对应的实际的表,对于已经存在数据的表,请谨慎操作。

  • 单个删除:点击需要删除的表右侧删除按钮
  • 批量删除:勾选需要删除的实体,点击表格上方删除按钮

点击删除按钮后,将弹出删除选项,选择后点击确认按钮,即可删除。

  • 仅删除元数据:只删除元数据信息
  • 删除元数据及数据库中的表结构和表数据:同时删除元数据信息,以及当前连接的数据库中该表的表结构和表数据,


注意

若删除的表被其他表关联,则不允许删除,需要将关联关系改为无后,才能删除。

# 从数据库导入

使用从数据库导入功能,可将数据库中已有数据表,导入为实体信息。

选择需要导入实体的模块,点击表格上方从数据库导入按钮,将弹出从数据库导入窗口。

窗口将展示当前连接的数据库中所有的表(过滤了实体管理中已存在的表),勾选需要导入的表,若需要继承父模板,可在下方选择需要继承的父模板,最后点击保存按钮,即可导入。

从数据库导入有以下规则:

  • 导入的数据的同步状态规则:

    • 字段、索引:若所有必填字段(除字段名称)都读取成功,则字段/索引状态置为已同步,否则置为未同步。
    • 若字段、索引都为已同步,且表所有必填项(除表名称、实体名称)都读取成功,则表状态为已同步,否则为未同步。
  • 只要字段编码匹配上父模板中的预置字段,就将此字段看做是父模板中的字段,不再导入为业务字段或辅助功能。

  • 字段类型按照数据类型映射管理中的配置映射成本平台定义的标准类型,并遵照以下规则:

    • 只匹配到一个标准类型时,直接匹配成功
    • 匹配到多个数据类型时,选择数据类型映射中【匹配映射】属性配置为是的数据类型,若还是匹配到多个类型,选择第一个。若【匹配映射】都为否,选择第一个。
    • oracle的Number类型映射规则:根据读取的最大长度和小数位数进行如下特殊处理:
      • 小数位数>0,映射为定点数
      • 小数位数<=0,长度<=3,映射为整数-tinyint
      • 小数位数<=0,3<长度<=5,映射为整数-smallint
      • 小数位数<=0,5<长度<=7,映射为整数-middleint
      • 小数位数<=0,7<长度<=10,映射为整数-int
      • 小数位数<=0,11<长度<=19,映射为整数-bigint
      • 小数位数<=0,长度>19,映射为定点数
  • 元数据属性是否可以导入情况如下表:

    (1)表信息

属性名 是否可以导入 导入规则
表编码 Y 转小写导入
表名称 Y 读取表描述,可能为空
主键类型 Y
主键生成策略 N Mysql、人大金仓、南大通用可以识别自增策略
实体编码 Y 代码统一处理为表编码转大驼峰
实体名称 Y 读取表描述,可能为空
继承父模版 Y 用户手动选择
国际化 N
国际化翻译表名 N
是否启用 N
排序 N
描述 N
辅助功能 Y

(2)字段信息

属性名 是否可以导入 导入规则
表字段编码 Y 转小写导入
实体字段编码 Y 代码统一处理为字段编码转小驼峰
字段名称 Y 读取字段描述,可能为空
字段类型 Y
是否持久化 Y
是否必填 Y
是否主键 Y
业务类型 N
排序 Y

(3)关联关系:无法导入
(4)唯一性校验:无法导入
(5)场景支持:无法导入

# 复制新增

选择需要复制新增实体的模块,点击复制新增按钮,即可弹出复制新增窗口。

窗口将展示当前可以复制新增的实体,勾选需要复制新增的实体,点击下一步按钮,即可进入编辑页面。

编辑页面将展示上一步勾选的实体及索引信息,若勾选复制索引代表复制实体索引信息,索引编码必须手填,默认不勾选,即不复制索引,点击复制按钮,即可复制。

# 示例

为了更清晰的介绍实体管理的相关功能,此处列举一个实体具体的使用场景,供具体的功能描述时使用:

# 业务场景

1、人员管理页面:可以维护人员编码、姓名等的基本信息以及年龄、备注等不常用的扩展信息,同时还能维护多条人员的教育经历信息。
2、菜单管理页面:可以维护菜单编码、名称等基本信息。
3、菜单权限授权页面:可以给人员授权菜单权限。

# 数据表设计

根据上述业务场景描述,可以设计表结构如下:

1、人员表(hos_sys_person)

字段编码 字段名称 备注
id 主键id
code 编码
name 名称
id_card 证件号码
phone_number 手机号

2、人员扩展表(hos_sys_person_extend)

字段编码 字段名称 备注
id 主键id
old_name 曾用名
age 年龄
email 邮箱
remark 备注
person_id 人员id 关联hos_sys_person.id

3、人员教育经历表(hos_sys_person_edu)

字段编码 字段名称 备注
id 主键id
school_name 学校名称
start_time 入学时间
end_time 毕业时间
person_id 人员id 关联hos_sys_person.id

4、菜单表(hos_sys_menu)

字段编码 字段名称 备注
id 主键id
code 编码
name 名称
router 路由
remark 备注

5、人员菜单权限表(hos_sys_person_menu)

字段编码 字段名称 备注
id 主键id
menu_id 菜单id 关联hos_sys_menu.id
person_id 人员id 关联hos_sys_person.id

# 数据库同步

# 概述

数据库同步指元数据信息(实体管理中维护的表结构)与当前连接的数据库进行相互同步操作,包括同步到数据库从数据库同步。同步的属性包括:

  • 表结构:表名、表备注(表名称)、字段名、字段备注(字段名称)、字段类型、字段长度、是否为空、默认值、主键、主键生成策略
  • 索引:索引名(索引编码)、索引类型、索引字段
  • 约束:约束名(约束编码)、约束类型、约束字段

# 同步到数据库

同步到数据库指将元数据信息同步到当前连接的数据库当中。同步到数据库有以下三种方式:

1、单个同步:点击实体数据右侧数据库同步按钮,即可将该实体同步到数据库当中
2、批量同步:勾选需要同步的实体,点击表格上方实体同步按钮,即可将选中的实体同步到数据库当中
3、模块同步:点击模块右侧数据库同步按钮,该模块下的所有实体都将同步到数据库当中

# 同步日志

点击同步按钮后,将弹出提示框,实时滚动显示同步信息,包括表名、执行的SQL脚本、同步结果、错误原因等

若在同步任务执行中关闭窗口,或任务执行完成后,还可以点击同步日志按钮,进入同步日志页面中查看历史日志

同步日志分为两个TAB页签,分别是同步日志和单表同步日志

  • 同步日志:以同步任务为单位,记录每次同步操作的日志信息。

点击日志数据右侧按钮,可查看日志详情。

  • 单表同步日志:以表为单位,记录每个表的同步操作信息

点击日志数据右侧按钮,可查看日志详情。

# 同步规则

系统在进行同步到数据库操作时,有以下处理逻辑:

  • 读取当前连接数据库中的表结构,与元数据信息进行比较,对有差异的属性进行增量更新
  • 若此表在当前数据库中不存在:直接创建表
  • 新建表时,字段按以下规则排序:主键排最前,业务字段第二,父模版第三,辅助功能最后,按排序号升序排列
  • 更新表时,字段顺序无法固定,只能加在最后面
  • 更新表/字段/索引/约束时,以表/字段/索引/约束编码为准。例如有表table1字段A修改为字段B,数据库中table1被手动新增一个字段B,将元数据同步到数据库的效果是,将数据库中table1的字段A编码变为B,字段B被删除

# 从数据库同步

同步到数据库指将当前连接数据库中的表结构同步到元数据信息中。每次只能操作一个表:

# 同步规则

系统在进行同步到数据库操作时,有以下处理逻辑:

  • 读取当前连接数据库中的表结构,与元数据信息进行比较,对有差异的属性进行增量更新
  • 若此表在当前数据库中不存在:系统报错
  • 若父模板和辅助功能字段有差异,此字段及所属表的同步状态将变为未同步,无法更新此字段的元数据信息。
  • 更新表/字段/索引/约束时,以表/字段/索引/约束编码为准。例如数据库有表table1字段A修改为字段B,元数据中table1被手动新增一个字段B,从数据库同步的效果是,将元数据中table1的字段A编码变为B,字段B被删除

# 代码生成

# 概述

代码生成指根据实体管理中维护的信息生成MVC三层架构代码,生成的代码可直接运行,提供基础的增删改查接口,支持双模架构,支持在实体管理中配置的一系列功能, 包括:关联关系、是否持久化、是否必填、最大值最小值、数据校验、多租户、树形、逻辑删除、唯一性校验、场景支持(国际化、加密解密)。

【菜单路径:】系统配置化平台 -> 元数据 -> 元数据管理 -> 点击一个应用 -> 实体建模 -> 代码生成

# 操作步骤

点击模块右侧代码生成按钮,或勾选需要生成代码的实体,点击表格上方代码生成按钮,即可进入代码生成界面

先选择想要生成代码的模板,此处模板列表在代码生成模板管理功能中维护。选择好模板后,页面将根据模板内配置的文件动态加载需要填写的配置项

# 代码生成方式

代码生成窗口中,代码生成方式有两种:

  • zip压缩包下载:以压缩包的形式将代码下载到本地。不需要填写相关的代码生成路径,不存在需要合并代码的情况

  • 自定义路径:由系统参数设置决定是否显示此选项。指代码生成到指定路径当中,需要填写代码生成路径,代码生成方式可选择合并代码或者生成新文件

字段名 字段说明
模板 生成代码的模板
代码生成方式 ZIP压缩包下载/自定义路径
代码生成路径 代码所在模块的路径,如:hos-app-core/hos-app-core-api
包名 代码所在包,如:com.mediway.hos.app.entity
uri前缀 Controller接口访问地址前缀,如:/org/staff
服务名 Api接口中FeignClient注解的value属性值,详见服务名
作者 必填,在生成的代码中显示代码的作者
作者邮箱 在生成的代码中显示作者邮箱

# 服务名

为了兼容双模架构(详见双模架构功能手册),代码生成时,支持生成api类,并支持配置注解@FeignClient中的服务名参数。服务名配置有以下两种类型:

  • 固定值:直接配置服务名,配置和代码生成的效果举例:

@FeignClient(value = "hos-base-server",path = "/org/hos-prof-title")
public interface HosProfTitleApi{}
  • 变量:取配置文件中的值,配置和代码生成的效果举例:

//实际取值为配置文件中,hos-base-server变量配置的值
@FeignClient(value = "${hos-base-server}",path = "/org/hos-prof-title")
public interface HosProfTitleApi{}

# 代码生成列表

代码生成列表支持根据表编码、表名称进行高亮搜索。

字段名 字段说明
是否已生成 当前表还未生成过代码前,此状态为否;若表已经生成过一次代码,则变为是
要生成的文件 显示选中的模板中配置的所有文件
生成方式 可选择合并生成,或生成新文件,详细介绍见生成方式

点击业务代码生成右侧编辑按钮,可单独修改每一个表的文件信息,包括访问地址及文件名称(类名)。修改操作只对本次代码生成操作有效

# 生成方式

  • 合并:若生成路径中,没有同名旧文件,或者旧文件和生成的新文件没有冲突时,将直接合并生成新的文件。若存在同名旧文件并存在代码冲突,则点击 代码生成按钮后, 将弹出代码合并窗口,如下图:

点击每个文件右侧代码合并按钮,进入合并页面,页面左侧为原来的代码文件,页面右侧为新生成的文件,点击合并按钮可进行相关合并操作。

  • 使用原文件:使用左侧文件,丢弃右侧文件
  • 使用新文件:使用右侧文件,丢弃左侧文件

所有文件合并完成后,点击代码合并窗口确定按钮即可。

  • 新文件:若生成路径中已存在同名旧文件,将在生成的新文件的名称后自动加上序号,不会覆盖原来的旧文件,如下图所示:

# 关联数据绑定

基础平台支持通过注解方式,完成关联对象的绑定,使用者不需要编写额外的代码和SQL,只需要进行以下两步操作,就可在操作主对象时,完成关联对象的增删改查。

1、给主对象实体添加关联对象属性并添加关联注解
2、在需要关联操作的接口中添加关联方法

实体管理中,可配置实体间的关联关系,根据配置好的关联关系,可自动生成关联注解和关联方法的代码。

# 关联注解

# 关联实体

关联实体注解 @BindEntity 适用于 1-1的关联关系,在示例中,人员表和人员信息扩展表通过person_id字段一对一关联, 若想在增删改查人员时,同时增删改查人员扩展信息,可进行如下配置:

public class SysPerson extends BaseEntity<SysPerson> {
    
        @TableField(exist = false)
        @BindEntity(entity = SysPersonExtend.class, condition = "id = person_id")
        private SysPersonExtend personExtend;
}
  • 参数说明

    • entity:关联对象的实体class
    • condition:关联条件,例如示例中的条件,调用查询方法时,实际上相当于以下sql:
select pe.* from SysPerson p, SysPersonExtend pe where p.id = pe.person_id;

# 关联实体集合

关联实体集合注解@BindEntityList适用于 1-n的关联关系,在示例中,人员教育经历表和人员表通过person_id字段多对一关联, 若想在增删改查人员时,同时增删改查人员教育经历信息,可进行如下配置:

public class SysPerson extends BaseEntity<SysPerson> {
    
    @TableField(exist = false)
    @BindEntityList(entity = SysPersonEdu.class, condition = "id = person_id")
    private List<SysPersonEdu> eduList;
}
  • 参数说明

    • entity:关联对象的实体class
    • condition:关联条件,例如示例中的条件,调用查询方法时,实际上相当于以下sql:
select pe.* from SysPerson p, SysPersonEdu pe where p.id = pe.person_id;

# 通过中间表关联实体集合

关联实体集合注解@BindMiddleEntityList适用于 n-n的关联关系,在示例中,菜单表和人员表通过中间表多对多关联, 若想在查询人员时,同时查询出改人员被授权的菜单列表,可进行如下配置:

public class SysPerson extends BaseEntity<SysPerson> {
    
    //添加此字段后,查询人员时,可同时查询出改人员被授权的菜单列表
    @TableField(exist = false)
    @BindMiddleEntityList(entity = SysMenu.class, condition = "menu_id = id", middleEntity = SysPersonMenu.class, middleCondition = "id = person_id")
    private List<SysMenu> menuList;
}
  • 参数说明

    • entity:关联对象的实体class
    • condition:中间表和关联表之间的的关联条件
    • middleEntity:中间表对象的实体class
    • middleCondition:主表和中间表之间的的关联条件,例如示例中的条件,实际上相当于以下sql:
select m.* from SysPerson p, SysMenu m, SysPersonMenu pm  where pm.menu_id = m.id and p.id = pm.person_id;

# 关联属性

关联属性注解 @BindField 适用于关联关系为 1-1,但用户不想查出整个实体,而只是想查询关联对象的某个属性的情况。在示例中, 人员教育经历表和人员表通过person_id字段多对一关联,若想在查询人员教育经历信息时,同时查出人员名称,可进行如下配置:

public class SysPersonExtend extends BaseEntity<SysPersonExtend> {
    
    @TableField(exist = false)
    @BindField(entity = SysPerson.class, condition = "person_id = id", field = "name")
    private String personName;
}
  • 参数说明

    • entity:关联对象的实体class
    • field:绑定关联表中的字段
    • condition:关联条件,例如示例中的条件,调用查询方法时,实际上相当于以下sql:
select p.name from SysPerson p, SysPersonExtend pe where p.id = pe.person_id;

# 关联方法

添加完关联注解之后,可在主对象的查询接口中添加关联方法:

# 查询

public class SysPersonServiceImpl {
    public SysPerson bindSelectById(String key) {
        SysPerson result = selectById(key);
        //关联查询,同时查出和SysPerson关联的实体,result参数支持SysPerson或List<SysPerson>
        BindHandler.bindQuery(result);
        return result;
    }
}

# 新增

public class SysPersonServiceImpl {
    @Transactional
    public int bindInsert(SysPerson record) {
        int result = myMapper.insert(record);
        //关联新增,同时新增和SysPerson关联的实体,record参数支持SysPerson或List<SysPerson>
        //不支持@BindField和@BindMiddleEntityList注解
        BindHandler.bindInsert(record);
        return result;
    }
}

# 修改

public class SysPersonServiceImpl {
    @Transactional
    public int bindUpdateById(SysPerson record) {
        int result = myMapper.updateById(record);
        //关联更新,同时更新和SysPerson关联的实体,record参数支持SysPerson或List<SysPerson>
        //不支持@BindField和@BindMiddleEntityList注解
        BindHandler.bindUpdate(record);
        return result;
    }
}

# 删除

public class SysPersonServiceImpl {
    @Transactional
    public int deleteById(String key) {
        int result = 0;
        SysPerson t = selectById(key);
        if (t != null) {
            result = myMapper.deleteById(key);
            //关联删除,同时删除和SysPerson关联的实体,t参数支持SysPerson或List<SysPerson>
            //不支持@BindField和@BindMiddleEntityList注解
            BindHandler.bindDelete(t);
        }
        return result;
    }
}

# 版本管理

# 概述

元数据管理提供了版本管理功能,包括版本发布和版本对比。

  • 版本发布:以应用为单位发布版本,即把当前状态下,该应用内的所有数据信息入库存档
  • 版本对比:将两个不同版本的元数据信息进行对比,输出增量SQL脚本

# 版本发布

点击应用管理页面中的发布按钮,弹出发布版本弹窗,填写版本号后,点击保存按钮,即可发布。


提示
1、单个应用的版本号不能重复
2、应用内有未同步的元数据时,不允许发布

# 版本对比

点击应用管理页面中的版本对比按钮,弹出对比窗口,选择需要对比的版本、导出的SQL脚本的数据库类型后,点击对比按钮,即可生成两个版本间的升级脚本。 点击下载按钮,可下载SQL文件。

# 查看ER图

实体支持查看实体间的关联关系图(ER图),他根据实体管理中配置的关联关系生成。有三个入口:

  • 应用管理:展示当前应用下所有实体间的关联关系

  • 模块管理:展示当前模块下所有实体间的关联关系

  • 实体:展示当前实体与其他实体的关联关系

在本文档所举的示例中,根据实体间的关联关系生成的ER图效果如下: