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,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框架会:
JdbcCustomConversions
引入扩展 Converterorg.mybatis.dynamic.sql.SqlColumn
定义引入 TypeHandler
, 和 parameter ParameterTypeConverter