Есть ли способ проверить, является ли строка, полученная из запроса JPA, допустимым пользовательским перечислением?

#java #hibernate #jpa #enums

Вопрос:

У меня есть модель сущности с внутренним пользовательским полем перечисления, например:

 @Entity
@Table(name = "TABLE_CUSTOM")
public class CustModel{

@Enumerated(EnumType.STRING)
@Column(name = "CUSTOM", length = 3, nullable = false)
private EnumCustom enumCustom;

}

public enum EnumCustom{
A, B, C, D, UNK;
}
 

//UNK расшифровывается как НЕИЗВЕСТНЫЙ

В этой таблице TABLE_CUSTOM есть столбец, содержащий возможные значения для полей enumCustom, но бывают случаи, когда могут появиться некоторые недопустимые значения (например, E, F), в этом случае я хотел бы установить это поле как UNK(неизвестно). Есть ли способ с помощью аннотации в этом поле или чего-то подобного решить эту проблему?

Комментарии:

1. Вы можете использовать конвертер атрибутов .

2. На самом деле, мое приложение развернуто на WebSphere 9, который, похоже, неправильно читает аннотацию @Converter, такого поведения не происходит в JBoss, на котором работает аннотация.

Ответ №1:

Вы можете использовать @postLoad для заполнения второго поля правильным значением перечисления:

 @Entity
@Table(name = "TABLE_CUSTOM")
public class CustModel{

    // populated with database String value via ORM framework
    private String enumDatabase;
    private EnumCustom enumCustom;

    @PostLoad
    private EnumCustom enumCustom;
        enumCustom = EnumCustom.valueOf(enumDatabase);
    }
}


public enum EnumCustom{
    A, B, C, D, UNK;

    public static void fromValue(String enumDatabase) {
        for(EnumCustom enumCustom : values()) {
            if (enumCustom.name().equals(enumDatabase) {
                return enumCustom;
            }
        }
        return EnumCustom.UNK;
    }
}