状态表替代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
相关产品推荐
相关产品推荐

