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


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 запрашивает ее.

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

Ответы:


184

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

@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

Я был в hibernate.ddl-auto=updateрежиме, и мне пришлось отбросить свою таблицу и позволить спящему режиму создать ее снова, чтобы преобразовать мое перечисление из int в varchar. Надеюсь, это поможет кому-то с подобной проблемой.
Arashsoft

См. Stackoverflow.com/questions/44864675/…, если ваше значение перечисления записывается как порядковое, несмотря на аннотацию Enumerated.
metamaker

На геттер не ставлю. Помещение его в объявление переменной работает нормально, что хорошо для Lombok с использованием @Data и т. Д. Что, если я хочу применить это ко всем перечислениям без аннотирования каждого из них?
Эндрю

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.