跳转到内容

扩展模型

概念

⚠️ “扩展模型” 不是模型模型扩展只是对原模型进行 修改或者新增 字段/索引,并不会产生新的模型,也无法修改原模型的配置。

“扩展模型” 可以拆分理解为:

  • 扩展字段:在数据库表结构上看,会在原模型的表上 添加/修改 扩展字段列。

  • 扩展索引:在数据库表结构上看,会在原模型的表上 添加/修改 索引。

  • 扩展字段组:在运行态,会可以覆盖原模型的字段组。

代码定义

“扩展模型”,需要给扩展类打上 @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/基础项目的在线化业务域 -> 模型 。模型记录点击”扩展”操作,提交后,实际生成的 “扩展模型”(不是模型),在之前选择的业务域对应类型的模型列表里。

具体操作参考下图。

extend

在线化创建的 “扩展模型” 生成代码的逻辑:从哪个模型(类)点的扩展,则 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。