需求描述
实际项目中, 存在部分模型不动态修改表结构,由单独DDL脚本处理
,常见的场景有:
- 已存在库和表中使用Oinone进行功能开发,此时对于已经存在的表对应的模型不允许改表结构
- 其他情况不希望动态改变表结构的情况
实现步骤
新建NODDL的基础模型
模型公共字段
公共字段说明:使用Oinone进行开发时,业务模型需继承基础IdModel(或者由IdModel衍生出的子类),这些基础模型有createDate(创建时间)、writeDate(更新时间)、createUid(创建人ID)和writeUid(更新人ID)等公共字段;实际表中公共字段可能与Oinone有所不同。
实现方式
-
方式1:公共属性字段用平台提供的createDate、writeDate、createUid和writeUid,通过指定column与表中的实际字段对应.
【推荐】该方式,公共字段的处理可以继续使用平台的默认赋值处理方式; -
方式2:继承平台的时候,把公共字段排除掉(配置unInheritedFields),然后自行加通用字段:
排除字段:@Model.Advanced(type= ModelTypeEnum.ABSTRACT, ordering = "createAt DESC, id DESC", unInheritedFields = {"createUid","writeUid","createDate","writeDate"})
【不推荐】该方式,公共字段的赋值逻辑需要自行处理,略显复杂;
实现方式举例
下面的示例以方式1
举例;假设表的基础字段分别是:createAt、updateAt、createId和updateId 与平台的不同.
- 不自动DDL的抽象模型示例
import pro.shushi.pamirs.meta.annotation.Field;
import pro.shushi.pamirs.meta.annotation.Model;
import pro.shushi.pamirs.meta.base.IdModel;
import pro.shushi.pamirs.meta.enmu.FieldStrategyEnum;
import pro.shushi.pamirs.meta.enmu.ModelTypeEnum;
import java.util.Date;
/**
* 假设表的基础字段分别是:createAt、updateAt、createId和updateId 与平台的不同
*/
@Model.model(BaseNoDdlModel.MODEL_MODEL)
@Model(displayName = "不自动DDL的抽象模型")
@Model.Advanced(type= ModelTypeEnum.ABSTRACT, ordering = "createAt DESC, id DESC")
public abstract class BaseNoDdlModel extends IdModel {
public static final String MODEL_MODEL = "hr.std.BaseNoDdlModel";
// 如果原表的主键的列名不是ID的情况,这里可以定义column指定ID属性对应的列名
/**
@Field.PrimaryKey
@Field(displayName = "主键ID")
@Field.Advanced(column = "XLH")
private Long id;
**/
// 下面这几个字段按实际项目中的情况来增加,包括字段名
@Field.Advanced(columnDefinition = "DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP", column = "createAt",
insertStrategy = FieldStrategyEnum.NEVER, updateStrategy = FieldStrategyEnum.NEVER, batchStrategy = FieldStrategyEnum.NEVER)
@Field(displayName = "创建时间", priority = 200)
private Date createDate;
@Field.Advanced(columnDefinition = "DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP", column = "updateAt",
batchStrategy = FieldStrategyEnum.NEVER)
@Field(displayName = "更新时间", priority = 210)
private Date writeDate;
@Field.Advanced(column = "createId")
@Field(displayName = "创建人ID", priority = 220, invisible = true)
private Long createUid;
@Field.Advanced(column = "updateId")
@Field(displayName = "更新人ID", priority = 230, invisible = true)
private Long writeUid;
}
- 不需动态DDL的业务模型,业务模型继承BaseNoDdlModel。 其他业务模型如果有相同的需求类似的做法
/**
* 测试合同表
*/
@Model.model(InspectionInfo.MODEL_MODEL)
@Model(displayName = "合同", labelFields = "contractName")
@Model.Code(sequence = "DATE_ORDERLY_SEQ", prefix = "TLHT", size = 4, initial = 0, format = "yyyyMMdd")
// 已存在的表名规则跟默认的规则不一样的情况,指定已存在的表名
@Model.Advanced(table = "t_inspection_info")
public class InspectionInfo extends BaseNoDdlModel {
public static final String MODEL_MODEL = "hr.std.InspectionInfo";
@Field.String
@UxForm.FieldWidget(@UxWidget(readonly = "true", hint = "系统自动生成"))
@Field(displayName = "合同编号", unique = true)
private String code;
@Field.String
@Field(displayName = "合同名称", required = true)
private String contractName;
@Field.String
@Field(displayName = "联系人")
private String contactPerson;
@Field.String
@Field(displayName = "联系电话")
private String contactPhone;
@Field.Text
@Field(displayName = "备注")
private String remarks;
}
YAML文件配置
数据源配置
新增一个数据源别名,数据源对应的物理库可以和其他数据源一样也可以不一样; 配置与其他数据一样
pamirs:
datasource:
# (不创建DDL)这里专门配置一个数据源名,上面配置这个数据不创建DDL
biz_data:
driverClassName: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/pamirs_biz?useSSL=false&allowPublicKeyRetrieval=true&useServerPrepStmts=true&cachePrepStmts=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
username: root
password: shushi@2019
initialSize: 5
maxActive: 200
minIdle: 5
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
asyncInit: true
biz:
driverClassName: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/pamirs_biz?useSSL=false&allowPublicKeyRetrieval=true&useServerPrepStmts=true&cachePrepStmts=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
username: root
password: shushi@2019
initialSize: 5
maxActive: 200
minIdle: 5
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
asyncInit: true
配置数据源策略
配置该数据源persistence策略:不创建库、也不创建表
pamirs:
persistence:
global:
auto-create-database: true
auto-create-table: true
ds:
# (不创建DDL) 配置数据别名biz_data不创建库和表。根据需求可以配置多个
biz_data: # 不创建DDL的数据源别名
auto-create-database: false
auto-create-table: false
配置模型和数据源的关联
pamirs:
framework:
data:
default-ds-key: pamirs
ds-map:
base: base
hr_simple_ce: biz
hr_simple: biz
# (不创建DDL)对应的模型不创建DDL,DDL由手动创建:
# 方式1:不要创建DDL的模型单独到一个模块中,这个模型指定到不创建DDL的数据源
# 方式2:同模块中中部分模型不需要动态创建DDL,配置modelDsMap(如下的配置)
modelDsMap: # 本示例采用方式2==>> [模型编码]: 数据名, 根据实际情况配置
"[hr.std.InspectionInfo]": biz_data
"[hr.std.SysTable]": biz_data
"[hr.std.SysTableField]": biz_data
业务功能
按照上述方式,新建的业务模型;与正常创建(自动创建DDL)的模型上无任何区别。可以按照的逻辑进行业务开发
Oinone社区 作者:望闲原创文章,如若转载,请注明出处:https://doc.oinone.top/dai-ma-shi-jian/20531.html
访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验