如何更好处理Enum - ApiHugHope 如何更好处理Enum(列表)https://apihug.com/zhCN-docs/how/003_how_to_handle_enum
Enum处理是个棘手的问题,在应用程序中,枚举常量很好避免了hard-code, 但是在API的传输、数据库层序列化反序列化如何处理Enum?
如果再加上列表支持, 这个问题就又复杂了一个维度,Enum 有默认的 name
和 oridinal
两种标识方式。
- name(string): Returns the name of this enum constant, exactly as declared in its enum declaration.
- 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
数据类型问题上找到了一个比较适中的方案:
两个交接点:
- 网络传输:API层, (Spring 自动处理)
- 序列化层: 数据库(读、写)
两种格式:
- 单个
- 多个(List)
目的:
- 直观简单
- 低学习成本
协议
自 1.1.5-RELEASE 只留下2中配置方式, 亦可参考 jakarta.persistence.EnumType
- STRING: 默认
hope.common.enumeration.Enumeration#title()
,代理到java.lang.Enum#name()
- 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
定义:
status_list
:OrderStatusEnum
列表,CODE
例子:100001,10002
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}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框架会:
- JDBC 配置时,
JdbcCustomConversions
引入扩展 Converter - Mybatis 配置时:
org.mybatis.dynamic.sql.SqlColumn
定义引入TypeHandler
, 和 parameterParameterTypeConverter