@DbEnumValue
Enum 的标准 JPA 映射有些危险。也就是说,使用 EnumType.ORDINAL
值依赖于 Enum 值的精确顺序不会改变(这是微妙的,我们只能在 Enum 的末尾添加值)。使用 EnumType.STRING
还可以,但会影响 Enum 值的名称或存储在数据库中的值。
提供 @DbEnumValue
来解决这些问题,当我们可以修改正在使用的 Enum 以为每个枚举值添加 DB 值时,可以使用它。
要使用 @DbEnumValue
,我们需要注释一个方法,该方法返回一个用于将 Enum 值映射到数据库中的值。
public enum Status {
NEW("N"),
ACTIVE("A"),
INACTIVE("I");
String dbValue;
Status(String dbValue) {
this.dbValue = dbValue;
}
// annotate a method that returns the value
// in the DB that the enum element maps to
@DbEnumValue
public String getValue() {
return dbValue;
}
}
存储
我们使用 storage
属性指定值映射到的 DB 类型。实际上,我们通常在希望将 Enum 值映射到数据库 INTEGER 类型时使用它。
public enum Status {
NEW("1"),
ACTIVE("2"),
INACTIVE("3");
String value;
Status(String value) {
this.value = value;
}
// map to DB INTEGER
@DbEnumValue(storage = DbEnumType.INTEGER)
public String getValue() {
return value;
}
}