扩展模型
概念
⚠️ “扩展模型” 不是模型,模型扩展只是对原模型进行 修改或者新增 字段/索引,并不会产生新的模型,也无法修改原模型的配置。
“扩展模型” 可以拆分理解为:
-
扩展字段:在数据库表结构上看,会在原模型的表上 添加/修改 扩展字段列。
-
扩展索引:在数据库表结构上看,会在原模型的表上 添加/修改 索引。
-
扩展字段组:在运行态,会可以覆盖原模型的字段组。
代码定义
“扩展模型”,需要给扩展类打上 @ExtendModel(OriginModel.class) 注解,OriginModel 代表原模型类名。继承原模型并不是必须的,使用继承是为了更方便的获取扩展字段。
io.terminus.trantorframework.api.annotation.ExtendModel,“扩展模型” 不是模型,因此没有模型配置(config)的口子。
public @interface ExtendModel { /** * 原模型类,类上必须标记了 @Model */ Class<? extends RootModel<?>> value();
/** * 索引,当原模型为 TransientModel 时无效 * ⚠️ 因为扩展字段和原模型在一张数据表,因此不建议扩展模型设置【唯一索引】,将会影响到原模型的唯一性 * ⚠️ 建议仅对扩展字段新建索引 */ Index[] indexes() default {};
/** * 字段组配置 */ FieldGroup[] fieldGroups() default {};}下面的代码演示了在原模型 Equipment 上新增一个设备使用状态的字段
@Data@ExtendModel(Equipment.class)public class EquipmentExtend extends Equipment {
@Field(name = "设备使用状态", nullable = false) @DictionaryMeta(value = EquipmentUseStatus.class) private String status;}💡Tips:扩展模型的字段定义与原模型一致,参考字段
在线化
Trantor 1.0 开始模型定义都在线上完成,打开交付控制台进行模型扩展(各开发环境的交付控制台不同,请各位开发同学根据自己实际的开发情况去访问)。
模型扩展的入口为 进入项目 -> 配置 -> 业务域 -> 进入依赖APP/基础项目的在线化业务域 -> 模型 。模型记录点击”扩展”操作,提交后,实际生成的 “扩展模型”(不是模型),在之前选择的业务域对应类型的模型列表里。
具体操作参考下图。

在线化创建的 “扩展模型” 生成代码的逻辑:从哪个模型(类)点的扩展,则 java 父类为那个类,而@ExtendModel(value=永远为原模型的类)。
举个例子:
1)gaia 新建原模型: key 为 gaia_A,java 类型为 io.terminus.gaia.A
2)gaia-app 从类名为 A,唯一标识为 gaia_A的模型记录,执行扩展, 创建 java 类型为 io.terminus.gaia.app.B的 “扩展模型”,则生成的 B 代码如下
package io.terminus.gaia.app;
import io.terminus.gaia.A;import io.terminus.trantorframework.api.annotation.ExtendModel;
@ExtendModel(value = A.class)public class B extends A {}3)custom 从类名为 B,唯一标识为 gaia_A的模型记录,执行扩展, 创建 java 类型 为 io.terminus.custom.C的 “扩展模型”,则生成的 C 代码如下。
package io.terminus.custom;
import io.terminus.gaia.A;import io.terminus.gaia.app.B;import io.terminus.trantorframework.api.annotation.ExtendModel;
@ExtendModel(value = A.class)public class C extends B {}4)custom 从类名为 A,唯一标识为 gaia_A的模型记录,执行扩展, 创建 java 类型 为 io.terminus.custom.C的 “扩展模型”,则生成的 C 代码如下。
package io.terminus.custom;
import io.terminus.gaia.A;import io.terminus.trantorframework.api.annotation.ExtendModel;
@ExtendModel(value = A.class)public class C extends A {}使用
“扩展模型” 不是模型,无论线下还是线上创建的 “扩展模型”,在使用时都使用原模型。
以创建 “扩展模型” 的视图为例:
- 线下:数据容器 Tag 的 model 需填写原模型的 key,扩展字段可以声明为
<Field/> - 线上:新建视图图时,所属模型选择原模型(也搜索不到“扩展模型”),扩展字段会自动带上。
建议与限制
由于扩展字段与模型在一张数据库表的原因,有一些限制:
- 扩展索引不建议新增唯一索引,会影响原模型或其他原模型的扩展模型。
- 扩展字段不能与原模型和原模型的其他字段同 key。
- 扩展字段建议都为非必填字段。
为了规范扩展模型的使用,在线化多了一些限制:
- 不支持扩展非持久化模型。
- App 不能扩展自己的模型,同理 业务域不能扩展自己的模型。
- 扩展 + 派生链路不可超过 3 层,即 A <- B <- C,无法再对 C 进行扩展或派生。
- 扩展模型不支持派生,但派生模型支持扩展。
- 同一业务域无法扩展同一模型多次,即业务域 A 扩展了 BModel,无法再扩展 BModel。