Page tree
转至元数据结尾
转至元数据起始

通过Java定义数据模型

模型定义必看:

  • Class以OC开头命名,遵循驼峰格式
  • 在应用项目中,如某个Class为Hibernate的可持久化对象(entity),则需继承OCBase Class。如该Class中的信息仅用来展示,不会被用来进行数据过滤,则可考虑按JSON格式来存储,需实现IBaseJsonObject接口。
  • Class上需添加Lombok @Data注解
  • 针对日期类型字段,需依据实际业务场景显示的设置如下注解(此处设置两个工具类库的注解,是因为Spring Boot默认使用的是Jackson框架,平台内部采用了Gson框架,为了避免开发时出现一些兼容问题,故设置两个注解)

    注解
    说明
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    此注解为Jackson提供,用来规定日期字段的接收和响应格式
    @JsonAdapter(OCDateTimeTypeAdapter.class)
    此注解为Gson提供,用来反序列化日期字段格式。目前只有两个可选值:

    OCDateTimeTypeAdapter.class: 将日期转换为 yyyy-MM-dd HH:mm:ss

    OCDateTypeAdapter.class:将日期转换为 yyyy-MM-dd

  • 实体中的字段如需被用在前端UI页面中,则需添加平台提供的注解:@OcColumn(title = '字段中文含义')
  • 针对设置了双向关联的实体(比如A实体关联了B实体,B实体中又关联了A实体),在某些场景调用ToString()的时候会出现StackOverFlow错误,参见:https://blog.csdn.net/qq_38425719/article/details/110503206 此文方法处理。

设置注解规则:

  • 平台目前采用了Hibernate框架做OR Mapping映射,开发者只需定义POJO Class即可,不需显示的在Class中添加Hibernate JPA相关注解。平台会通过字节码增强的方式为Class添加Hibernate JPA注解。
  • 如下几种场景需开发者手工配置添加注解的规则,详细配置参见:为Entity模型增加Annotation相关配置

    场景描述
    注解配置
    说明
    A与B实体是OneToMany和ManyToOne的关系getOneToManyAndManyToOnePairList通过设置OneToMany和ManyToOne注解,在关系型数据库中会少生成一张中间表。
    A与B实体是ManyToMany的关系

    getManyToManyFieldsForCollectionType

    平台针对实体中的集合类型字段,默认的注解是OneToMany。此时针对关系型数据库来说,会创建一个A与B的中间表,该中间表中指向B实体的字段上会有唯一性约束限制。 如果是ManyToMany的关系,就须设置@ManyToMany注解。这样A与B的中间表上不再会有唯一性约束。
    针对一些特定字段,设置该字段在关系型数据库表中的名字、类型等信息

    getCustomFields

    1、实体中定义的字段,默认是按照字段名来创建数据库表中的字段名。各数据库中有一些保留关键字是不允许在创建表时被使用的,例如:MySQL数据库中 key 这个字符串就是一个关键字。 2、针对String类型的字段,Hibernate框架做ORMapping映射时,在关系型数据库中的默认类型及长度为varchar(255),如需显示的设置该字段的类型和长度,就需手工配置注解规则 3、Oracle11G规定字段名不能大于30位,
    定义OneToMany、ManyToMany的中间表名

    getJoinTableNames

    1、目前平台默认生成的中间表的表名格式为:A实体的SimpleName + "_" + A实体中指向B实体的字段名 + "_" + B实体的SimpleName 2、Oracle11G规定数据库表名不能大于30位,Postgresql、Mysql不能大于64位。故在使用某些数据库时,需手工配置中间表的名称。
    定义实体在关系型数据库中的表名、索引、唯一键

    getClassAndTableNameAndIndexNameAndUniqueNameListPairs

    1、定义实体在关系型数据库中的表名 2、定义表中的索引 3、定义表上的唯一键
    断开实体之间的级联关系

    getAssociationsForNotCascade

    1、目前平台针对实体中关联其他实体的字段上默认设置了 @Cascade({CascadeType.ALL})
    2、某些场景不需设置级联关系的,需手工配置规则,将级联关系去掉(目前平台只支持将所有的级联关系去掉,暂不支持只移除某种级联关系)

针对平台提供的通用业务数据模型进行扩展:

平台目前提供了如下几类业务的通用业务数据模型,如开发者觉得字段不足、想添加新的数据模型,则可按如下方式进行配置:

通用业务数据模型
对应的JAR
AnnotationContext文件
客户open-care-customer-entity.jarCustomerAnnotationContext.java
产品open-care-product-entity.jarProductAnnotationContext.java
订单open-care-order-entity.jarOrderAnnotationContext.java
库存open-care-stock-entity.jarStockAnnotationContext.java
医疗open-care-medical-entity.jarMedicalAnnotationContext.java
问卷open-care-survey-entity.jarSurveyAnnotationContext.java

 

扩展既有实体中的字段:

1、在对应微服务的AnnotationContext.getExtendFields方法中添加配置

 
范例
添加基本类型字段
organizationFieldDTOS.add(new OcFieldDTO("organizationNo", String.class, "机构编号"));
添加集合类型字段
supplerFieldDTOS.add(new OcFieldDTO("interfaceSetting", new TypeToken<List<OCInterfaceSetting>>() {
}.getType(), "供应商自处理实现对象"));
添加Map类型字段
policyRiskDTOs.add(new OcFieldDTO("tags", new TypeToken<Map<String, String>>() {
}.getType(), "标签数据"));


 

自定义实体:

在open-care-app-entity-micro-annotated工程中的 src/main/com.open_care目录下各微服务目录下添加实体

  • 无标签