Enum处理是个棘手的问题,在应用程序中,枚举常量很好避免了hard-code, 但是在API的传输、数据库层序列化反序列化如何处理Enum?

如果再加上列表支持, 这个问题就又复杂了一个维度,Enum 有默认的 nameoridinal 两种标识方式。

  1. name(string): Returns the name of this enum constant, exactly as declared in its enum declaration.
  2. original(int): The ordinal of this enumeration constant (its position in the enum declaration, where the initial constant is assigned an ordinal of zero).

oridinal 视乎是个非常高效传递和存储方式, 但是original 在 Enum 演进过程中可能被破坏,而且难以理解和阅读。

基于此,Hope 框架, 集合丰富的工程实践,在何如处理 Enum 数据类型问题上找到了一个比较适中的方案:

两个交接点:

  1. 网络传输:API层, (Spring 自动处理)
  2. 序列化层: 数据库(读、写)

两种格式:

  1. 单个
  2. 多个(List)

目的:

  1. 直观简单
  2. 低学习成本

协议

1.1.5-RELEASE 只留下2中配置方式, 亦可参考 jakarta.persistence.EnumType

  1. STRING: 默认hope.common.enumeration.Enumeration#title(),代理到 java.lang.Enum#name()
  2. CODE: hope.common.enumeration.Enumeration#code() 未取 oridinal(hope框架内不再使用,避免解释和认知成本)
enum EnumType {
  //Default as STRING
  // Persist `hope.common.enumeration.Enumeration#title()` usually this will delegate to the `java.lang.Enum#name()`
  STRING = 0;
  // Persist `hope.common.enumeration.Enumeration#code()`
  CODE = 1;
}

定义

Entity 定义:

  1. status_list: OrderStatusEnum 列表,CODE 例子: 100001,10002
  2. status: 单个 OrderStatusEnum, 使用 TITLE 例子: PLACED
 repeated OrderStatusEnum status_list = 3 [(hope.persistence.column) = {
    name: "STATUS_LIST",
    type: VARCHAR
    length:{
      value: 64
    }
    enum_type: CODE
  }];

  OrderStatusEnum status = 4 [(hope.persistence.column) = {
    name: "status",
    type: VARCHAR
    length:{
      value: 64
    }
    enum_type: STRING
  }];

生成

生成部分主要涉及: Spring JDBC reader/writer(OLAP), Mybatis Reader/Query(OLTP);

Hope OLTP 基于 Spring Data JDBC (非 JPA/Hibernate/Mybatis)!

OLAP 基于 Mybatis Query DSL, 用于统计、查询, 不建议用来做写操作!

类名功能包含类备注
*domain.bootstrap.converter.{Domain}ConverterSpring data convertOrderStatus(CodeListReaderConverter、CodeListWriterConverter、Title)Spring JDBC 初始化注入
*domain.bootstrap.mybatis.type.*TypeHandleribatis type TypeHandlerOrderStatus(CodeListTypeHandler、TitleListTypeHandler、Title)Batis Column Converter

Hope框架会:

  1. JDBC 配置时, JdbcCustomConversions 引入扩展 Converter
  2. Mybatis 配置时:org.mybatis.dynamic.sql.SqlColumn 定义引入 TypeHandler, 和 parameter ParameterTypeConverter