Сопоставление перечисления со строкой в ​​спящем режиме

93

У меня есть модель спящего режима категории:

@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: либо, CategoryIncomeлибо CategoryOutcome. Я хотел бы, чтобы класс модели Category принимал переменную enum и каким-то образом сопоставлял ее со строкой, когда hibernate запрашивает ее.

Является ли это возможным?

Ducin
источник

Ответы:

184

Да, возможно. Должен быть:

@Enumerated(EnumType.STRING)
@Column(name = "category_type")
private CategoryType categoryType;
Dcernahoschi
источник
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
Я был в hibernate.ddl-auto=updateрежиме, и мне пришлось отбросить свою таблицу и позволить спящему режиму создать ее снова, чтобы преобразовать мое перечисление из int в varchar. Надеюсь, это поможет кому-то с подобной проблемой.
Arashsoft
См. Stackoverflow.com/questions/44864675/…, если ваше значение перечисления записывается как порядковое, несмотря на аннотацию Enumerated.
metamaker
На геттер не ставлю. Помещение его в объявление переменной работает нормально, что хорошо для Lombok с использованием @Data и т. Д. Что, если я хочу применить это ко всем перечислениям без аннотирования каждого из них?
Эндрю
1

Принятого ответа для PostgreSQL недостаточно . Прилагаю ту реализацию, которая у меня сработала:

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

Брайан Коронел
источник
Спасибо, мой брат
IonicMan