Хранить Enums в БД - PullRequest
       1

Хранить Enums в БД

0 голосов
/ 23 ноября 2018

Меня попросили создать столбец с именем Type varchar2(1), который имеет значения partial или all

То, что я сделал в Model.Java

    @Column(name="TYPE")
    @Enumerated(EnumType.STRING)
    public TypeEnum getType() {
        return type;
    }

    public void setType(TypeEnum type) {
        this.type = type;
    }

А это мой TypeEnum.java

public enum TypeEnum {
    ALL(0, "all"),
    PARTIAL(1, "partial");

    private int code;
    private String value;

    private TypeEnum(int code, String value) {
        this.code = code;
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public int getCode() {
        return code;
    }

    public static TypeEnum getTypeEnum(String value){
        TypeEnum[] types = values();
        for(int i=0; i<types.length; i++){
            TypeEnum type = types[i];
            if(value.equals(type.getValue()))
                return type;
        }
        return null;
    }

}

Итак, как хранить TypeEnum в БД для достижения varchar2 (1)

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Этого можно добиться, внедрив AttributeConverter<TypeEnum, String>

@Converter
public class TypeEnumConverter implements AttributeConverter<TypeEnum, String> {

    @Override
    public String convertToDatabaseColumn(TypeEnum attribute) {
        return String.valueOf(attribute.getCode());
    }

    @Override
    public TypeEnum convertToEntityAttribute(String dbData) {
        return getTypeEnumFromCode(parseInt(dbData));
    }
}

getTypeEnumFromCode, аналогично вашему getTypeEnum методу.

Затем определите его как

@Column("TYPE")
@Convert(TypeEnumToString.class)
TypeEnum type;

ps. Я только что использовал code из вашего перечисления, но это может быть и любая другая логика.

0 голосов
/ 23 ноября 2018

Вы можете использовать конвертер для сопоставления ваших перечислений с varchar (1) самостоятельно.Что-то вроде:

@Column("TYPE") @Convert(TypeEnumToString.class) TypeEnum type;

с реализованным классом конвертера что-то вроде:

public class TypeEnumToString implements AttributeConverter<TypeEnum, String> {
  @Override
  public TypeEnum convertToEntityAttribute(String value) {
    // return conversion;
  }
  @Override
  public String convertToDatabaseColumn(TypeEnum value) {
    // return conversion;               
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...