いつものように、Java 列挙型には対応するコードと名前の説明があります。また、そのようなフィールドを含む Java クラスには、それらが Enum として含まれます。
public enum MyEnum{
SOMEINSTANCE(1, "test1"),
SOMEINSTANCE(2, "test2");
private final int code;
private final String name;
private MyEnum(int code, String name){
this.code = code;
this.name = name;
}
... helper getter for code and name
}
@Entity
puclic class EnumHolder{
private MyEnum myEnum;
}
私は JPA の初心者ですが、「myEnums
」テーブルを次のようにしたいと考えています。
code int not null, name varchar(50) not null)
私のenumHolder
テーブルにはmyEnumCode
、myEnums テーブルを指すフィールドが必要です。
EnumType.ORDINAL と EnumType.STRING の両方をサポートする currenlty を使用するのは良い考えではないと思います。
そして別の質問です。myEnums
JavaMyEnum
クラス データを使用してテーブルに入力するにはどうすればよいですか? どのようにしますか?最善のアプローチをお願いします。
PS: 私が提供できるソリューションは次のとおりです。
と namemyEnum
を持つテーブルがあるとしましょう。質問に記載されているJava列挙型。テーブルにはフィールドへの参照が必要です。同意しない場合は、解決策をコメントしてください。code
fields
MyEnum
enumHolder
myEnumCode
myEnum.code
@Entity
@Access(AccessType.FIELD)
public class EnumHolder {
@Id private int id;
@Transient private MyEnum myEnum;
…
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public MyEnum getMyEnum() { return MyEnum; }
public void setMyEnum(MyEnum myEnum) { this.myEnum = myEnum; }
@Access(AccessType.PROPERTY) @Column(name="myEnumCode")
protected int getMyEnumForDb() {
return myEnum.getCode();
}
protected void setMyEnumForDb(int enumCode) {
myEnum = MyEnum.getByCode( enumCode);
}
…
}
もちろん、ここには欠点があります。しかし、現時点では、より良いアプローチが見えません。EnumType.ORDINAL および EnumType.STRING の代替は提供しないでください。その使用法に存在する可能性のあるすべての問題をここに書きたくはありません (Effective Java では、序数の使用法について説明されています)。EnumType.STRINGを使用すると、データベースに説明を付けてdbから要求することができないため、どちらも好きではありません。
fillind データベースについて。myEnum
テーブルをクリアし、各Java列挙型インスタンスに対してテーブルに挿入するスクリプトを作成することは難しくないと思います。そして、展開段階で常にそれを行います。