私の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として扱うように指定するにはどうすればよいですか? (大きな違いはありませんが、それについて動揺するのに十分です。)
私の理解では、MySQL列挙型は非常にプロプライエタリであり、Hibernateによって十分にサポートされていません。GavinKingの このコメント を参照してください(この関連する問題は少し異なりますが、それは重要な部分ではありません)。
だから、私はあなたがあなた自身のUsereType
を使用しなければならないと思うので、柔軟なソリューション-作業バージョンJava 5 EnumUserType から(例については、Appfuseの HibernateでのJava 5 Enums Persistence を参照)。
個人的には、MySQL列挙型を使用するという考えを忘れてしまいました。「メリット」に価値があるとは確信していません(詳細については この回答 を参照してください)。
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;
@Enumerated(EnumType.STRING)を使用して、次のように列挙型を定義してください。
enum Gender {
male,
female
}
小文字の値に注意してください。
これは、少なくともVARCHAR列で機能します。文字列「男性」または「女性」として列挙型を格納します。
なぜ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>
この場合ではなく、誰かが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。