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