实体类status属性使用枚举类型的步骤

1. 问题引出

当实体类的状态属性为Integer类型时,容易写错

2. 初步修改

把状态属性强制为某个类型,并且自定义一些可供选择的常量。

java 复制代码
public class LessonStatus {

    public static final LessonStatus NOT_LEARNED = new LessonStatus(0,"未学习");
    public static final LessonStatus LEARNING = new LessonStatus(1,"学习中");
    public static final LessonStatus FINISHED = new LessonStatus(2,"已学完");
    public static final LessonStatus INVALID = new LessonStatus(3,"已失效");

    private int value;
    private String desc;

    private LessonStatus(int value, String desc){
        this.value=value;
        this.desc=desc;
    }
}

在java1.4过后,可以用enum类型代替以上写法

java 复制代码
public enum LessonStatus {

    NOT_LEARNED(0,"未学习"),
    LEARNING(1,"学习中"),
    FINISHED(2,"已学完"),
    INVALID(3,"已失效");

    private int value;
    private String desc;
    LessonStatus(int value,String desc){
        this.value = value;
        this.desc = desc;
    }
}

使用该类型

3. @EnumValue

但是这样做,将数据插入表时会产生类型不匹配的问题。实体类为enum类型,表的列属性为tinyint类型。

因此,给需要注入值的字段加上@EnumValue注解,表示插入数据库时,实际上插入的是该字段而不是整个枚举对象。

再次测试,成功

4. 使用案例

@JsonValue :与@EnumValue相似,转换成json对象时,只序列化该注解下的字段
@JsonCreator:json反序列化,将该字段转换成一个object对象

java 复制代码
@Getter
public enum LessonStatus implements BaseEnum {
    NOT_BEGIN(0, "未学习"),
    LEARNING(1, "学习中"),
    FINISHED(2, "已学完"),
    EXPIRED(3, "已过期"),
    ;
    @JsonValue
    @EnumValue
    int value;
    String desc;

    LessonStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static LessonStatus of(Integer value){
        if (value == null) {
            return null;
        }
        for (LessonStatus status : values()) {
            if (status.equalsValue(value)) {
                return status;
            }
        }
        return null;
    }
}
java 复制代码
@Getter
public enum PlanStatus implements BaseEnum {
    NO_PLAN(0, "没有计划"),
    PLAN_RUNNING(1, "计划进行中"),
    ;
    @JsonValue
    @EnumValue
    int value;
    String desc;

    PlanStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }


    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
    public static PlanStatus of(Integer value){
        if (value == null) {
            return null;
        }
        for (PlanStatus status : values()) {
            if (status.equalsValue(value)) {
                return status;
            }
        }
        return null;
    }
}

json序列化见下一篇博客@JsonValue和@JsonCreator使用

相关推荐
njidf14 小时前
趣味项目与综合实战
jvm·数据库·python
李昊哲小课14 小时前
PyMySQL完整教程
服务器·数据库·python·pymysql
sqyno1sky14 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
互联网科技看点14 小时前
2025-2026年研发管理软件推荐:产品研发全流程一体化靠谱解决方案评测
服务器·数据库·人工智能
Yupureki14 小时前
《Linux系统编程》12.基础IO
linux·运维·c语言·开发语言·数据库·c++
瀚高PG实验室14 小时前
nginx中配置数据库连接
运维·数据库·nginx·瀚高数据库
一个天蝎座 白勺 程序猿14 小时前
Oracle替换工程实践深度解析:从迁移挑战到金仓“零改造”实践
数据库·学习·oracle·kingbasees
Sahas101914 小时前
安装 Redis 为系统服务
数据库·redis·缓存
一蓑烟雨*任平生14 小时前
【无标题】
数据库
霖霖总总15 小时前
[Redis小技巧27]Redis Cluster 全景指南:Gossip 协议、故障转移与生产避坑实战
数据库·redis·缓存