JPAを使用して列挙型をマップするさまざまな方法を探しています。特に、各enumエントリの整数値を設定し、整数値のみを保存したいと考えています。
@Entity
@Table(name = "AUTHORITY_")
public class Authority implements Serializable {
public enum Right {
READ(100), WRITE(200), EDITOR (300);
private int value;
Right(int value) { this.value = value; }
public int getValue() { return value; }
};
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "AUTHORITY_ID")
private Long id;
// the enum to map :
private Right right;
}
簡単な解決策は、EnumType.ORDINALでEnumeratedアノテーションを使用することです。
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
しかし、この場合、JPAは列挙インデックス(0,1,2)をマップし、必要な値(100,200,300)はマップしません。
私が見つけた2つの解決策は単純ではないようです...
最初の解決策
ここで提案されているソリューションは、@ PrePersistと@PostLoadを使用して列挙型を他のフィールドに変換し、列挙型フィールドを一時的としてマークします。
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
2番目のソリューション
ここで提案された2番目のソリューションは、一般的な変換オブジェクトを提案しましたが、それでも重くて休止状態指向です(@TypeはJava EEには存在しないようです)。
@Type(
type = "org.appfuse.tutorial.commons.hibernate.GenericEnumUserType",
parameters = {
@Parameter(
name = "enumClass",
value = "Authority$Right"),
@Parameter(
name = "identifierMethod",
value = "toInt"),
@Parameter(
name = "valueOfMethod",
value = "fromInt")
}
)
他の解決策はありますか?
私はいくつかのアイデアを念頭に置いていますが、それらがJPAに存在するかどうかはわかりません。
- Authorityオブジェクトを読み込んで保存するときに、Authority Classの正しいメンバーのセッターメソッドとゲッターメソッドを使用する
- 同等のアイデアは、JPAにenumをintに変換し、intをenumに変換するRight enumのメソッドは何かを伝えることです。
- Springを使用しているため、JPAに特定のコンバーター(RightEditor)を使用するように指示する方法はありますか?