跳转到内容

模型

代码地址:trantor-example-model

模型及模型间关系的定义既是对具体业务的设计和抽象,也是驱动由 Trantor 构建的中后台系统的约定,详情见:理解Trantor->模型

同时,模型是 Trantor 体系的核心,模块中最重要的资源即模型,视图和行为都与模型相关联,详情见:理解Trantor Module

模型定义示例如下:

  1. 模型定义注解@TModel

    Trantor通过@TModel 注解声明模型。用户在声明模型时,Trantor提供了两个基类 BaseModel<ID>(继承RootModel) 和 RootModel<ID> 供用户继承。其中的泛型 ID 用于指定模型主键类型,可选 Long 和 String 。两者的最大区别是 RootModel 中只包含 id 字段,BaseModel 还包含了 createdBy 、updatedBy 、createdAt 、updatedAt 、isDeleted 等一系列内置字段。当声明持久化模型时,建议使用 BaseModel ,当然也可以使用 RootModel 。

  2. 模型字段定义注解

    模型中字段通过@TModelField和一系列字段元信息注解(Meta Annotation)定义。

以下为一个模型定义示例,模型定义详见:模型定义开发文档

@EqualsAndHashCode(callSuper = true)
@Data
@TModel(
name = "学生模型",
mainField = Student.name_field,
indexes = {
@Index(columns = Student.country_field)
},
fieldGroups = {
@FieldGroup(fieldName = {Teacher.id_field, Teacher.name_field}),
@FieldGroup(fieldName = {Teacher.name_field}, type = FieldGroupType.SEARCHABLE),
@FieldGroup(fieldName = {Teacher.name_field}, type = FieldGroupType.SEARCH_SHOW),
},
enableSearch = true,
enableImport = true,
enableExport = true
)
public class Student extends BaseModel<Long> {
private static final long serialVersionUID = -4434701696846600802L;
/**
* 通过TModelField注解的nullable属性添加在数据库表中name字段不可以为空,未注解的字段不会被当做模型字段,而会被直接忽略。
* 通过JSR-303注解为示例学生模型 name 字段添加页面输入检查不能为空;
* 关于JSR-303规范:https://www.e-learn.cn/content/qita/2644564
*/
@TModelField(name = "姓名", nullable = false)
@NotNull(message = "姓名不可为空")
private String name;
/**
* 通过TModelField注解的type属性添加页面输入手机号格式检查
*/
@TModelField(name = "手机号", type = TModelFieldType.Phone)
private String mobile;
/**
* 通过TModelField注解的type属性添加页面输入邮箱格式检查
*/
@TModelField(name = "邮箱", type = TModelFieldType.Email)
private String email;
@TModelField(name = "国家")
@DictionaryMeta(clazz = Country.class)
private String country;
/**
* 文件最大允许大小,单位 KB ,默认 Integer.MAX_VALUE ,大约 2T
*/
@TModelField(name = "图片")
@ImageMeta(maxSize = 3 * 1024)
private String image;
@TModelField(name = "简述", type = TModelFieldType.MultiText)
@TextMeta(length = 512)
private String desc;
@TModelField(name = "个人履历", type = TModelFieldType.RichText)
private String resume;
/**
* 通过NumberMeta注解来增加显示单位
*/
@TModelField(name = "薪水")
@NumberMeta(unit = "")
private Double salary;
/**
* 定义OneToOne:一个学生只能含有一张校园卡,一张校园卡同时只能对应一个学生
*/
@TModelField(name = "学生卡")
@RelationMeta(name = "StudentAndStudentCard")
private StudentCard studentCard;
/**
* 定义OneToMany,由于类型擦除,需要modelClass定义对端模型
* name:关系名称,正则匹配:[A-Z][A-zA-Z0-9]*。
*/
@TModelField(name = "课程")
@RelationMeta(name = "StudentAndSubject", modelClass = Subject.class)
private List<Subject> subjects;
/**
* 定义ManyToMany,由于类型擦除,需要modelClass定义对端模型
*/
@TModelField(name = "教师")
@RelationMeta(name = "StudentAndTeacher", modelClass = Teacher.class, opposite = RelationType.ToMany)
private List<Teacher> teachers;
}