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?

ducin
sumber

Jawaban:

184

Ya, mungkin. Harus:

@Enumerated(EnumType.STRING)
@Column(name = "category_type")
private CategoryType categoryType;
dcernahoschi.dll
sumber
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
1

Jawaban yang diterima tidak cukup untuk PostgreSQL . Saya melampirkan implementasi yang berhasil untuk saya:

https://stackoverflow.com/a/64021041/5279996

Braian Coronel
sumber
Terima kasih saudaraku
IonicMan