You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

状态表替代Enum后,状态数据插入及服务类使用方法咨询

状态数据插入方案

1. 数据库初始化脚本

直接编写SQL脚本,在项目部署或启动前执行,插入固定状态数据。示例:

INSERT INTO complaint_status (name_ar, name_en, code)
VALUES 
('مفتوح', 'Open', 1),
('قيد المعالجة', 'In Progress', 2),
('مغلق', 'Closed', 3);

如果用Spring Boot,可将脚本放在src/main/resources/data.sql中,项目启动时会自动执行(需确保数据源配置允许执行初始化脚本)。

2. 项目启动时自动初始化(避免重复插入)

借助Spring Boot的CommandLineRunner,启动时检查状态是否存在,不存在再插入,防止重复数据:

@Component
public class ComplaintStatusInitializer implements CommandLineRunner {

    private final ComplaintStatusRepository statusRepo;

    public ComplaintStatusInitializer(ComplaintStatusRepository statusRepo) {
        this.statusRepo = statusRepo;
    }

    @Override
    public void run(String... args) throws Exception {
        if (statusRepo.count() == 0) {
            ComplaintStatus open = new ComplaintStatus();
            open.setNameAr("مفتوح");
            open.setNameEn("Open");
            open.setCode(1L);
            statusRepo.save(open);

            ComplaintStatus inProgress = new ComplaintStatus();
            inProgress.setNameAr("قيد المعالجة");
            inProgress.setNameEn("In Progress");
            inProgress.setCode(2L);
            statusRepo.save(inProgress);

            // 其他状态按需添加
        }
    }
}

3. 数据库迁移工具(适合团队协作)

使用Flyway或Liquibase,将初始化脚本作为版本化迁移文件,每次部署时自动执行,确保所有环境数据库数据一致。比如Flyway的V1__initial_complaint_status.sql文件,放在src/main/resources/db/migration目录下。


服务类中使用状态实体的方法

1. 创建Repository接口

public interface ComplaintStatusRepository extends JpaRepository<ComplaintStatus, Long> {
    // 根据code查询状态
    ComplaintStatus findByCode(Long code);
    // 根据英文名称查询
    ComplaintStatus findByNameEn(String nameEn);
}

2. 在服务类中封装状态获取方法

把常用状态的查询封装成方法,用法和之前的Enum一样便捷:

@Service
public class ComplaintStatusService {

    private final ComplaintStatusRepository statusRepo;

    public ComplaintStatusService(ComplaintStatusRepository statusRepo) {
        this.statusRepo = statusRepo;
    }

    // 缓存查询结果,避免重复查库
    @Cacheable(value = "complaintStatus", key = "#root.methodName")
    public ComplaintStatus getOpenStatus() {
        return statusRepo.findByNameEn("Open");
    }

    @Cacheable(value = "complaintStatus", key = "#root.methodName")
    public ComplaintStatus getInProgressStatus() {
        return statusRepo.findByNameEn("In Progress");
    }

    @Cacheable(value = "complaintStatus", key = "#code")
    public ComplaintStatus getStatusByCode(Long code) {
        return statusRepo.findByCode(code);
    }
}

3. 在业务服务中直接调用

比如在投诉业务服务里使用:

@Service
public class ComplaintService {

    private final ComplaintStatusService statusService;
    private final ComplaintRepository complaintRepo;

    public ComplaintService(ComplaintStatusService statusService, ComplaintRepository complaintRepo) {
        this.statusService = statusService;
        this.complaintRepo = complaintRepo;
    }

    public void createNewComplaint(ComplaintDTO dto) {
        Complaint complaint = new Complaint();
        // 直接获取状态实体,和之前用Enum的方式逻辑一致
        complaint.setStatus(statusService.getOpenStatus());
        // 其他属性赋值...
        complaintRepo.save(complaint);
    }
}

内容的提问来源于stack exchange,提问作者DarkBot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:41:29