enumをhibernateの文字列にマッピングする


92

私はカテゴリ休止モデルを持っています:

@Entity
@Table(name = "category")
public class Category {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private long id;

    @Column(name = "type")
    private String type;

タイプ文字列フィールドがあります。また、カテゴリのタイプを表すJava列挙型も用意しています。

public enum CategoryType {
    INCOME, OUTCOME;
}

文字列型の代わりに使用したい。SQLは、varcharパラメータで2つの異なる値(CategoryIncomeまたは)を受け入れますCategoryOutcome。カテゴリモデルクラスが列挙型変数を受け入れて、休止状態が要求するたびに何らかの方法で文字列にマッピングしたいと思います。

出来ますか?

回答:


182

はい、可能です。そのはず:

@Enumerated(EnumType.STRING)
@Column(name = "category_type")
private CategoryType categoryType;

15
JPA 2.1がリリースされるあなたも、今、使用をさらに行くとすることができます@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
membersound

6
同じ問題を抱えている可能性のある人のために..:このアノテーションをフィールドの代わりにゲッターメソッドに配置する必要がありました@Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }
ZeroOne 2016年

私はhibernate.ddl-auto=updateモードになっていて、列挙型をintからvarcharに変換するために、テーブルを削除し、Hibernateにもう一度作成する必要がありました。うまくいけば、それは同様の問題を持つ誰かを助ける。
Arashsoft 2018

列挙型のアノテーションにもかかわらず列挙値が序数として記述されている場合は、stackoverflow.com / questions / 44864675 /…を参照してください。
メタメーカー2018

ゲッターには載せません。変数宣言に配置するとうまく機能します。これは、@ Dataなどを使用するLombokに適しています。それぞれに注釈を付けずにすべてのEnumに適用したい場合はどうなりますか?
アンドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.