18

Enum をフィールドとして含む HBM ファイルにクラスを作成しようとしています。

HBM は次のようになります。

<class name="a.b.c.myObject" table="OBJECT" >
       <property name="myEnum" column="EXAMPLE" type="a.b.c.myEnum" />
</class>

これがEnumであるとしましょう:

public enum myEnum{
    a, b, c;
}

問題は、DB でその列挙型 (a、b、または c) の文字列値が表示されることを期待していましたが、代わりにそのフィールドの生データを取得したことです。

どうすれば解決できますか?

4

6 に答える 6

17

Hibernate 3.6.x を使用したソリューションは次のとおりです。

<class name="a.b.c.myObject" table="OBJECT">
  <property name="myEnum" column="EXAMPLE">
    <type name="org.hibernate.type.EnumType">
      <param name="enumClass">a.b.c.myEnum</param>
    </type>       
  </property>
</class>
于 2011-06-24T15:31:08.020 に答える
7

1) 簡単な解決策: XML ベースのマッピングの代わりにHibernate Annotationsを使用します。列挙型のサポートは組み込みです:

@Entity
public class MyObject {
  @Enumerated(EnumType.STRING)
  @Column(name="EXAMPLE")
  private MyEnum myEnum;
}

2) 注釈を使用できない場合でも、XML ベースのマッピングで提供される EnumType を使用できます。展開中にクラスパスに適切なものが必要ですがhibernate-annotations.jar、コンパイル時の依存関係はありません。

<class name="a.b.c.myObject" table="OBJECT" >
  <property name="myEnum" column="EXAMPLE" type="org.hibernate.type.EnumType"/>
</class>
于 2009-12-13T19:58:05.947 に答える
6

@Emmanuel Bourgの回答を編集して、次の<param>ように別の回答を追加するだけです:

<class name="a.b.c.myObject" table="OBJECT">
    <property name="myEnum" column="EXAMPLE">
        <type name="org.hibernate.type.EnumType">
            <param name="enumClass">a.b.c.myEnum</param>
            <param name="type">12</param>
        </type>       
    </property>
</class>

12 はjava.sql.Types.VARCHAR

于 2014-07-01T07:08:47.233 に答える
3

理由は不明ですが、Hibernate の開発者は、Hibernate コアを Java5 より前のバージョンと互換性を維持することを主張しています。つまり、enum はサポートされていません。Enum フィールドを永続化しようとすると、シリアル化され、バイナリ データが取得されます。

.hbm マッピング構成を使用して列挙型を永続化する場合は、UserType処理する列挙型ごとにカスタムを作成して構成する必要がありますが、これは面倒で面倒です。Hibernateのドキュメンテーション wikiには多くの例がありますが、その多くは互いに矛盾しているように見え、一部は機能します。

ただし、Hibernate アノテーションを使用すると、java5 列挙型の自動処理を含む完全な java5 サポートが得られます。あなたがどちらかをしなければならないのは本当に残念です。

于 2009-12-13T20:03:06.607 に答える
0

それを効率的に永続化するには、UserType を使用する必要があります。https://www.hibernate.org/265.html

于 2009-12-13T14:38:19.580 に答える