如何将枚举默认值的rule值而非枚举名称存入数据库?
解决方案
要实现将枚举对应的rule值存入数据库,而非枚举名称,可借助JPA的AttributeConverter自定义枚举与数据库字段的转换逻辑,具体步骤如下:
1. 补全枚举类的核心方法
原枚举类缺少构造方法、rule的获取方法,以及从rule值反向匹配枚举的逻辑,先补全:
public enum RuleMarkup { MANUAL("manual markup"), NO_REQUIRED("markup not required"); private final String rule; // 构造方法初始化rule值 RuleMarkup(String rule) { this.rule = rule; } // 获取枚举对应的rule值 public String getRule() { return rule; } // 根据数据库返回的rule值,反向查找对应的枚举实例 public static RuleMarkup fromRule(String rule) { for (RuleMarkup markup : RuleMarkup.values()) { if (markup.getRule().equals(rule)) { return markup; } } throw new IllegalArgumentException("未找到匹配的RuleMarkup枚举:" + rule); } }
2. 实现枚举与数据库字段的转换器
创建转换器类,负责枚举与字符串的双向转换:
import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; @Converter(autoApply = true) // autoApply=true表示全局生效,也可仅在指定字段单独配置 public class RuleMarkupConverter implements AttributeConverter<RuleMarkup, String> { // 将枚举转换为数据库存储的字符串(即rule值) @Override public String convertToDatabaseColumn(RuleMarkup attribute) { return attribute == null ? null : attribute.getRule(); } // 将数据库返回的字符串转换为枚举实例 @Override public RuleMarkup convertToEntityAttribute(String dbData) { return dbData == null || dbData.isEmpty() ? null : RuleMarkup.fromRule(dbData); } }
3. 调整实体类的字段注解
移除原有的@Enumerated注解,替换为@Convert指定转换器(若已设置autoApply=true,此步骤可省略):
public class Document { @Id @Column(name = "id") @GeneratedValue private Long id; @Column(name = "type") private Long subjectType; @Column(name = "markup") @Convert(converter = RuleMarkupConverter.class) private RuleMarkup nonRuleMarkup = RuleMarkup.MANUAL; }
完成以上配置后,保存Document实体时,数据库markup字段会存入manual markup而非枚举名称MANUAL;查询时也会自动将数据库的字符串转回RuleMarkup枚举对象,完全适配枚举字段类型。
内容的提问来源于stack exchange,提问作者Aleksandr Berestov
相关产品推荐
相关产品推荐

