Memetakan enum ke string dalam mode hibernasi


93

Saya punya model Kategori Hibernasi:

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

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

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

yang memiliki bidang tipe string. Saya juga punya enum Java yang mewakili jenis kategori:

public enum CategoryType {
    INCOME, OUTCOME;
}

yang ingin saya gunakan sebagai pengganti tipe string. SQL menerima dua nilai berbeda dalam parameter varchar: baik CategoryIncomeatau CategoryOutcome. Saya ingin kelas model Kategori menerima variabel enum - dan memetakannya ke string kapan pun hibernasi memintanya.

Apa itu mungkin?

Jawaban:


184

Ya, mungkin. Harus:

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

15
Anda bahkan dapat pergi lebih jauh dan, sekarang sebagai JPA 2.1 dirilis, penggunaan@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
membersound

6
Bagi siapa saja yang mungkin memiliki masalah yang sama ..: Saya harus meletakkan penjelasan ini untuk metode pengambil saya bukan lapangan, seperti ini: @Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }.
ZeroOne

Saya dalam hibernate.ddl-auto=updatemode dan saya harus melepaskan tabel saya dan membiarkan hibernasi membuatnya lagi untuk mengubah enum saya dari int ke varchar. Semoga membantu seseorang dengan masalah serupa.
Arashsoft

Lihat stackoverflow.com/questions/44864675/… jika nilai enumerasi Anda ditulis sebagai ordinal meskipun anotasi Enumerasi.
metamaker

Saya tidak menaruhnya pada pengambil. Menempatkannya di deklarasi variabel berfungsi dengan baik, yang bagus untuk Lombok menggunakan @Data, dll. Bagaimana jika saya ingin menerapkan ini ke semua Enum tanpa membuat anotasi satu per satu?
Andrew

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.