@DbEnumValue

Enumの標準的なJPAマッピングは、ある程度危険です。つまり、EnumType.ORDINAL値の使用は、Enum値の正確な順序が変化しない場合に依存します(微妙で、Enumの最後にのみ値を追加できます)。EnumType.STRINGの使用は問題ありませんが、Enum値の名前かデータベースに格納されている値のどちらかが妥協されます。

@DbEnumValueは、各enum値のDB値を追加するために使用されているEnumを変更できる場合に、これらの問題に対処するために提供され、使用できます。

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