質問
多くの場合、値がJava列挙から得られるDAOにフィールドがあると便利です。典型的な例は、ユーザーを<!> quot; NORMAL <!> quot;として特徴付けるフィールドが通常あるログインDAOです。または<!> quot; ADMIN <!> quot;。 Hibernateでは、次の2つのオブジェクトを使用して、この関係を(半)タイプセーフな方法で表します。
class User {
String username;
String passwd;
UserType type;
}
class UserType {
private enum Type {ADMIN, NORMAL};
private String type;
//Setters/Getters for Hibernate
public void setType(String type);
public String getType();
//Setters/Getters for user
public void setUserType(UserType.Type t);
public UserType.Type getUserType();
public static UserType fromType(UserType.Type t);
}
これは機能しますが、UserTypeクラスは不格好で、いくつかの値を格納するためだけに多くの官僚主義を必要としています。理想的には、Hibernateは列挙型フィールドを直接サポートし、列挙値を保存するための追加のテーブルを作成する必要があります。
私の質問は、Hibernateで列挙クラスを直接マップする方法はありますか?そうでない場合、列挙を表すための私のパターンは十分ですか、何か不足していますか?他のどのようなパターンを使用していますか?
解決
休止状態またはJPAアノテーションを使用:
class User {
@Enumerated(EnumType.STRING)
UserType type
}
UserTypeは単なる標準のJava 5列挙型です。
これが単なる注釈に限定されるとは想像できませんが、hbmファイルでこれを行う方法は実際にはわかりません。非常にバージョンに依存している可能性がありますが、推測していますが、hibernate 3.2+が必要であると確信しています。
編集:hbmでも可能ですが、少し面倒です。これをご覧くださいフォーラムスレッド
他のヒント
Hibernateドキュメントから: http://www.hibernate.org/272.html
列挙型ごとに新しいtypedefを作成し、プロパティタグでtypedefを参照できます。
マッピングの例-インライン<type>
タグ
<property name='suit'>
<type name="EnumUserType">
<param name="enumClassName">com.company.project.Suit</param>
</type>
</property>
マッピングの例-<typedef>
<typedef name="suit" class='EnumUserType'>
<param name="enumClassName">com.company.project.Suit</param>
</typedef>
<class ...>
<property name='suit' type='suit'/>
</class>