目录数据库
最近有需求,想存自定义的枚举值,好比ide
HOTLINE("Hotline")
我想存 Hotline
因而研究了一下Java的枚举问题this
以下数据库的Entity (贫血模型哈)code
@Entity @Table(name = "complaint") public class Complaint { @Id @GeneratedValue private Long id; private CaseOrigin origin; }
枚举orm
public enum CaseOrigin { HOTLINE("Hotline"), EMAIL("mail/fax/email"), WALK_IN("Walk-in"), OTHER("Others"); public String value() { return value; } private final String value; private CaseOrigin(String value) { this.value = value; } }
用的是Spring Boot 自带的 Hibernate
Hibernate 提供了两种方便的注解接口
@Enumerated(EnumType.ORDINAL) private CaseOrigin origin;
OTHER("Others")
存的是OTHER
@Enumerated(EnumType.STRING) private CaseOrigin origin;
可是这两种方式,都不符合个人需求,我想存的是 Others
因而,找到了目前为止最优雅的方式get
实现接口 AttributeConverter
重写接口的方法,很表意,就不解释了。it
public class CaseOriginConverter implements AttributeConverter<CaseOrigin, String> { @Override public String convertToDatabaseColumn(CaseOrigin attribute) { return attribute.value(); } @Override public CaseOrigin convertToEntityAttribute(String dbData) { return CaseOrigin.formDbValue(dbData); } }
枚举咱们也要改造一下,固然,若是不想改造枚举类。在类CaseOriginConverter
重写convertToEntityAttribute(String dbData)
就要费点事了,好比switch
,反射
(最优雅的方式 )form
public enum CaseOrigin { HOTLINE("Hotline"), EMAIL("mail/fax/email"), WALK_IN("Walk-in"), OTHER("Others"); public String value() { return value; } private final String value; public static final Map<String, CaseOrigin> dbValues = new HashMap<>(); static { for (CaseOrigin value : values()) { dbValues.put(value.value, value); } } private CaseOrigin(String value) { this.value = value; } public static CaseOrigin formDbValue(String dbValue) { return dbValues.get(dbValue); } }
最后用的地方到了class
@Convert(converter = CaseOriginConverter.class) private CaseOrigin origin;
这样就OK了。