
How
Hope 如何更好处理Enum(列表)
Enum处理是个棘手的问题,在应用程序中,枚举常量很好避免了hard-code, 但是在API的传输、数据库层序列化反序列化如何处理Enum?
如果再加上列表支持, 这个问题就又复杂了一个维度,Enum 有默认的 name 和 oridinal 两种标识方式。
oridinal 视乎是个非常高效传递和存储方式, 但是original 在 Enum 演进过程中可能被破坏,而且难以理解和阅读。
基于此,Hope 框架, 集合丰富的工程实践,在何如处理 Enum 数据类型问题上找到了一个比较适中的方案:
两个交接点:
两种格式:
目的:
自 1.1.5-RELEASE 只留下2中配置方式, 亦可参考 jakarta.persistence.EnumType
hope.common.enumeration.Enumeration#title(),代理到 java.lang.Enum#name()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 定义:
status_list:  OrderStatusEnum 列表,CODE 例子: 100001,10002status:  单个 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}Converter | Spring data convert | OrderStatus(CodeListReaderConverter、CodeListWriterConverter、Title) | Spring JDBC 初始化注入 | 
| *domain.bootstrap.mybatis.type.*TypeHandler | ibatis type TypeHandler | OrderStatus(CodeListTypeHandler、TitleListTypeHandler、Title) | Batis Column Converter | 
Hope框架会:
JdbcCustomConversions 引入扩展 Converterorg.mybatis.dynamic.sql.SqlColumn 定义引入 TypeHandler, 和 parameter ParameterTypeConverter