82

値が Java 列挙から取得される DAO にフィールドがあると便利なことがよくあります。典型的な例はログイン 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 は enum フィールドを直接サポートし、列挙値を格納する追加のテーブルを作成する必要があります。

私の質問は: Hibernate で列挙型クラスを直接マップする方法はありますか? そうでない場合、列挙を表すための私のパターンは十分ですか、それとも何か不足していますか? 人々は他にどのようなパターンを使用しますか?

4

2 に答える 2

111

hibernate または JPA アノテーションの使用:

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

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

これが注釈だけに限定されているとは想像できませんが、hbm ファイルでこれを行う方法が実際にはわかりません。バージョンに大きく依存している可能性がありますが、私は推測していますが、休止状態 3.2+ が必要であることは確かです。

編集: hbm では可能ですが、少し面倒です。このフォーラム スレッドをご覧ください。

于 2009-01-12T13:16:58.510 に答える
14

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>
于 2009-01-06T16:11:02.180 に答える