web-dev-qa-db-ja.com

Hibernateの列挙型、列挙型として保持

私のMySQLデータベースには、列「gender enum( 'male'、 'female')」があります

列挙型「com.mydomain.myapp.enums.Gender」を作成し、Personエンティティで「Gender gender」と定義しています。

MySQLデータベースに列挙型を保持したいのですが、アプリケーションを起動すると次のようになります。

列GenderのMyApp.Personの列タイプが間違っています。見つかった:列挙型、予想された:整数

どうしてこれなの?これは、「性別」に「@Enumerated(EnumType.ORDINAL)」という注釈を付けたのと同じです。 EnumTypeはORDINALまたはSTRINGのいずれかにしかなれないように思えるので、フィールドをintではなくenumとして扱うように指定するにはどうすればよいですか? (大きな違いはありませんが、それについて動揺するのに十分です。)

38
niklassaers

私の理解では、MySQL列挙型は非常にプロプライエタリであり、Hibernateによって十分にサポートされていません。GavinKingの このコメント を参照してください(この関連する問題は少し異なりますが、それは重要な部分ではありません)。

だから、私はあなたがあなた自身のUsereTypeを使用しなければならないと思うので、柔軟なソリューション-作業バージョンJava 5 EnumUserType から(例については、Appfuseの HibernateでのJava 5 Enums Persistence を参照)。

個人的には、MySQL列挙型を使用するという考えを忘れてしまいました。「メリット」に価値があるとは確信していません(詳細については この回答 を参照してください)。

26
Pascal Thivent

Hibernateに列定義を指定すると、1つを推測しようとしません。

@Column(columnDefinition = "enum('MALE','FEMALE')")
@Enumerated(EnumType.STRING)
private Gender gender;

何らかの理由でスキーマを生成するためにHibernateに依存していない場合、columnDefinitionに実際の値を提供する必要さえありません。このようにして、値の同期を維持する必要があるインスタンスを削除します。 Java enumとLiquibaseまたはSQLスクリプトを同期させてください:

@Column(columnDefinition = "enum('DUMMY')")
@Enumerated(EnumType.STRING)
private ManyValuedEnum manyValuedEnum;
24
Jimmie Fulton

@Enumerated(EnumType.STRING)を使用して、次のように列挙型を定義してください。

enum Gender {
  male,
  female
}

小文字の値に注意してください。

これは、少なくともVARCHAR列で機能します。文字列「男性」または「女性」として列挙型を格納します。

17
Juha Syrjälä

なぜHibernateのドキュメントにないのか分かりませんが、あなたはこれを行うことができます

<property name="type" column="type" not-null="true">
    <type name="org.hibernate.type.EnumType">
        <param name="enumClass">com.a.b.MyEnum</param>
        <param name="type">12</param>
        <!-- 12 is Java.sql.Types.VARCHAR -->
    </type> 
</property>
5
Kikoz

この場合ではなく、誰かがXMLマッピングを使用している場合:

<property name="state" column="state" not-null="true">
  <type name="org.hibernate.type.EnumType">
    <param name="enumClass">com.myorg.persistence.data.State</param>
  </type>
</property>

データベースの列タイプは数値でなければなりません。序数値の読み取りを可能にするmysqlのtinyint。

4