知识卡片
枚举映射优先用EnumType.STRING保留业务含义
内容
关系数据库基本类型没有枚举。若领域模型字段为枚举,通常将对应列定义为smallint,再通过@Enumerated表示枚举含义。但smallint虽能体现值的有序性,运维查询时得到的却是没有业务含义的数字,制造理解障碍。为此可将列定义为VARCHAR,在领域模型中定义枚举,并通过@Enumerated(EnumType.STRING)将枚举转换为字符串——注意数据库字符串需与枚举的字符串值及大小写保持一致。发散:@Ordinal(数字)方案的隐患不止可读性,还在于调整枚举顺序会静默改变已存数据的语义;EnumType.STRING以少量存储换取语义稳定,通常更值得。
参考来源
- 位置:《解构领域驱动设计》第19章 19.2.2(源文件:_epub-src/OEBPS/032.xhtml)
- 结论依据:原文对比smallint与EnumType.STRING两种枚举映射,指出后者保留业务可读性。
- 原始内容:smallint……查询得到的枚举值却是没有任何业务含义的数字,制造了理解障碍。为此,可将列定义为VARCHAR……通过在@Enumerated指定EnumType为STRING类型。