web-dev-qa-db-ja.com

Hibernateの列挙

値がJava列挙型であるDAOにフィールドがあると便利です。典型的な例は、ユーザーを「NORMAL」または"ADMIN"。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で列挙クラスを直接マップする方法はありますか?そうでない場合、列挙を表すための私のパターンは十分ですか、何か不足していますか?他のどのようなパターンを使用していますか?

82

休止状態またはJPAアノテーションを使用:

class User {
   @Enumerated(EnumType.STRING)
   UserType type
}

UserTypeは単なる標準のJava 5列挙型です。

これが単なる注釈に限定されるとは想像できませんが、hbmファイルでこれを行う方法は実際にはわかりません。それは非常にバージョンに依存しているかもしれません、私は推測していますが、hibernate 3.2+が必要であると確信しています。

編集:それはHBMで可能ですが、少し面倒です、これを見てください フォーラムスレッド

110
Gareth Davis

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>
15
Craig