@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;
  }
}