模型定义在数据库中的映射

模型定义在数据库中的映射

Oinone中通过定义模型来建立数据表,使用注解的方式来使多张表之间的关联。

  1. 数据库字段与模型定义字段映射

    模型定义在数据库中的映射

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.core.common.enmu.DataStatusEnum;
    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.DateFormatEnum;
    import pro.shushi.pamirs.meta.enmu.DateTypeEnum;
    import pro.shushi.pamirs.meta.enmu.MimeTypeEnum;
    
    import java.math.BigDecimal;
    import java.util.Date;
    
    @Model.model(PamirsDemo.MODEL_MODEL)
    @Model(displayName = "PamirsDemo")
    public class PamirsDemo extends IdModel {
    
       public static final String MODEL_MODEL = "top.PamirsDemo";
    
       @Field.Binary(mime = MimeTypeEnum.html)
       @Field(displayName = "二进制类型")
       private Byte[] byteType;
    
       @Field.Integer
       @Field(displayName = "整数")
       private Long longType;
    
       @Field.Float
       @Field(displayName = "浮点数")
       private BigDecimal floatType;
    
       @Field.Boolean
       @Field(displayName = "布尔类型")
       private Boolean booleanType;
    
       @Field.Enum
       @Field(displayName = "枚举")
       private DataStatusEnum enumType;
    
       @Field.String
       @Field(displayName = "字符串")
       private String stringType;
    
       @Field.Text
       @Field(displayName = "多行文本")
       private String textType;
    
       @Field.Html
       @Field(displayName = "富文本")
       private String richText;
    
       @Field.Date(type = DateTypeEnum.DATE, format = DateFormatEnum.DATE)
       @Field(displayName = "日期类型")
       private Date dataType;
    
       @Field.Date(type = DateTypeEnum.DATETIME, format = DateFormatEnum.DATETIME)
       @Field(displayName = "日期时间类型")
       private Date dataTimeType;
    
       @Field.Money
       @Field(displayName = "金额")
       private BigDecimal amount;
    }
    

    更多字段基础请参考文档字段基础与复合

  2. 多对一的关系映射

    例:设计一张教师表,一张科目表,教师表对科目表属于多对一的关系,在教师表中使用科目id管理关联关系。

    教师表teacher

    模型定义在数据库中的映射

    科目表professional

    模型定义在数据库中的映射


    那么在Oinone的模型定义中,这两张表定义是这样的;

    教师模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    
    @Model.model(Teacher.MODEL_MODEL)
    @Model(displayName = "教师", summary = "教师")
    public class Teacher extends IdModel {
    
       public static final String MODEL_MODEL = "top.Teacher";
    
       @Field.String
       @Field(displayName = "教师名字")
       private String teacherName;
    
       @Field.Integer
       @Field(displayName = "科目id")
       private Long professionalId;
    
       @Field(displayName = "关联科目")
       @Field.many2one
       @Field.Relation(relationFields = {"professionalId"},referenceFields = {"id"})
       private Professional professional;
    }
    

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    科目模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    
    import java.util.List;
    
    @Model.model(Professional.MODEL_MODEL)
    @Model(displayName = "科目", summary = "科目")
    public class Professional extends IdModel {
    
       public static final String MODEL_MODEL = "top.Professional";
    
       @Field.String
       @Field(displayName = "科目名称")
       private String professionalName;
    
    }

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    使用@Field.many2one注解管理教师与科目的多对一关系,在表操作时会自动维护关联关系。如果业务上是一对一的关系,在模型定义中建议使用多对一进行关联。

  3. 一对多的关系映射

    例:设计一张学生表,一张科目表,学生表对科目表属于一对多的关系,在科目表里使用学生ID与学生表进行关联。

    学生表student
    模型定义在数据库中的映射
    科目表professional
    模型定义在数据库中的映射


    那么在Oinone的模型定义中,这两张表定义是这样的;
    学生模型

    package pro.shushi.pamirs.top.api.model;
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    @Model.model(Student.MODEL_MODEL)
    @Model(displayName = "学生", summary = "学生")
    public class Student extends IdModel {
    
        public static final String MODEL_MODEL = "top.Student";
    
        @Field(displayName = "学生名字")
        @Field.String
        private String studentName;
    
        @Field(displayName = "学生ID")
        @Field.Integer
        private Long studentId;
    }
    

    该模型创建的数据库如下:
    模型定义在数据库中的映射

    科目模型

     package pro.shushi.pamirs.top.api.model;
    
     import pro.shushi.pamirs.meta.annotation.Field;
     import pro.shushi.pamirs.meta.annotation.Model;
     import pro.shushi.pamirs.meta.base.IdModel;
    
     import java.util.List;
    
     @Model.model(Professional.MODEL_MODEL)
     @Model(displayName = "科目", summary = "科目")
     public class Professional extends IdModel {
    
     public static final String MODEL_MODEL = "top.Professional";
    
         @Field.String
        @Field(displayName = "科目名称")
        private String professionalName;
    
        @Field(displayName = "关联学生")
        @Field.one2many
        @Field.Relation(relationFields = {"id"},referenceFields = {"studentId"})
        private List<Student> studentList;
    }

    在科目模型中建立@Field.one2many来管理学生和科目的关联关系。该模型创建的数据库如下:
    模型定义在数据库中的映射

  4. 多对多关系的关系映射

    例:设计一张教师表,一张学生表,教师表对学生表属于多对多的关系,使用中间表管理教师和学生的关联关系。

    教师表teacher

    模型定义在数据库中的映射

    学生表student

    模型定义在数据库中的映射

    教师学生中间表teacher_rel_student

    模型定义在数据库中的映射


    那么在Oinone的模型定义中,多对多关系是这样定义的;

    教师模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    
    import java.util.List;
    
    @Model.model(Teacher.MODEL_MODEL)
    @Model(displayName = "教师", summary = "教师")
    public class Teacher extends IdModel {
    
       public static final String MODEL_MODEL = "top.Teacher";
    
       @Field.String
       @Field(displayName = "教师名字")
       private String teacherName;
    
       @Field(displayName = "教师关联学生")
       @Field.many2many(through = TeacherRelStudent.MODEL_MODEL, relationFields = {"teacherId"}, referenceFields = {"studentId"})
       @Field.Relation(relationFields = {"id"}, referenceFields = {"id"})
       private List<Student> studentList;
    }

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    学生模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.IdModel;
    
    @Model.model(Student.MODEL_MODEL)
    @Model(displayName = "学生", summary = "学生")
    public class Student extends IdModel {
    
       public static final String MODEL_MODEL = "top.Student";
    
       @Field(displayName = "学生名字")
       @Field.String
       private String studentName;
    }

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    教师学生关系模型

    package pro.shushi.pamirs.top.api.model;
    
    import pro.shushi.pamirs.meta.annotation.Field;
    import pro.shushi.pamirs.meta.annotation.Model;
    import pro.shushi.pamirs.meta.base.BaseRelation;
    
    @Model.model(TeacherRelStudent.MODEL_MODEL)
    @Model(displayName = "教师学生关系表", summary = "教师学生关系表")
    public class TeacherRelStudent extends BaseRelation {
    
       public static final String MODEL_MODEL = "top.TeacherRelStudent";
    
       @Field.Integer
       @Field(displayName = "教师ID")
       private Long teacherId;
    
       @Field.Integer
       @Field(displayName = "学生ID")
       private Long studentId;
    }

    该模型创建的数据库如下:

    模型定义在数据库中的映射

    使用@Field.many2many注解以及中间管理关联关系,在表操作时自动维护关联关系。

Oinone社区 作者:yexiu原创文章,如若转载,请注明出处:https://doc.oinone.top/dai-ma-shi-jian/16109.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

(1)
yexiu的头像yexiu数式员工
上一篇 2024年8月16日 下午4:24
下一篇 2024年8月17日 下午3:50

相关推荐

  • 如何使用位运算的数据字典

    场景举例 日常有很多项目,数据库中都有表示“多选状态标识”的字段。在这里用我们项目中的一个例子进行说明一下: 示例一: 表示某个商家是否支持多种会员卡打折(如有金卡、银卡、其他卡等),项目中的以往的做法是:在每条商家记录中为每种会员卡建立一个标志位字段。如图: 用多字段来表示“多选标识”存在一定的缺点:首先这种设置方式很明显不符合数据库设计第一范式,增加了数…

    2023年11月24日
    82300
  • 代码示例:快速找到示例代码

    1、图表设计器 数据可视化能加载到的接口,方法上需要加 category = FunctionCategoryEnum.QUERY_PAGE @Model.model(ExpensesIncome.MODEL_MODEL) @Component @Slf4j public class ExpensesIncomeAction { @Function.Adva…

    2024年2月20日
    76500
  • 标品实施:从标品构建到定制(扩展)包的开发

    总体描述 Oinone有一个非常重要的特性:通过平台承载标准化产品(标品)。针对不同客户的个性化需求,不再直接修改标准产品代码,而是以扩展包的形式进行扩展和定制化,通过继承和重写标准产品的能力来满足客户需求。 本文讲解述怎么通过标品构建扩展工程的过程。 构建标品 按照Oinone的规范构建标品工程 构建扩展包 在定制模块中指定上游模块 上游依赖模块upstr…

    2024年6月1日
    1.1K00
  • 查询时自定义排序字段和排序规则

    指定字段排序 平台默认排序字段,参考IdModel,按创建时间和ID倒序(ordering = "createDate DESC, id DESC") 方法1:模型指定排序 模型定义增加排序字段。@Model.Advanced(ordering = "xxxxx DESC, yyyy DESC") @Model.mod…

    2024年5月25日
    94000
  • 如何删除系统权限中默认的首页节点

    场景: 并没有设置过首页的配置,为什么在系统权限这里的配置菜单中却有首页的配置。而且显示当前资源未完成初始化设置,无法配置。这个文章将帮助你删除这个节点。 注意:如果添加了以下代码,后续如果需要使用首页的配置,则需要删除该代码。 扩展权限加载节点: 遍历权限加载的节点,找到需要删除的模块首页节点。删除节点。 @Component @Order(88) @SP…

    2024年12月31日
    59300

发表回复

登录后才能评论