Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Enum com siglas no banco de dados

Estava mapeando uma simples classe que possui um campo chamado ATIVO que ira receber o valor de S ou N para identificar SIM ou NAO.

Sendo assim pensei em anota-lo como um @Enumerated(EnumType.STRING) e criar um AtivoEnum para utilizar no projeto.

O problema que ao tentar dar um findall() o java me retorna um erro dizendo que não existe o tipo S para o AtivoEnum.

Procurando na internet vi que algumas pessoas solucionaram esse problema criando um converter dentro enum e mapeando o campo com @Convert ficando com o codigo igual abaixo.

Enum Ativo

public enum AtivoEnum {
    SIM("S"), NAO("N");

    String valor;

    AtivoEnum(String valor){
        this.valor = valor;
    }

    private String getValor(){
        return this.valor;
    }

    @Converter(autoApply = true)
    public static class Mapeador implements AttributeConverter<AtivoEnum, String> {

        @Override
        public String convertToDatabaseColumn(AtivoEnum valor) {
            return valor.getValor();
        }

        @Override
        public AtivoEnum convertToEntityAttribute(String valor) {
            if(valor.equals("S")) {
                return SIM;
            } else if (valor.equals("N")){
                return NAO;
            } else {
                return null;
            }

        }
    }
}

Entidade Pais

@Entity
@Data
public class Pais {

    @Id
    private Integer id;
    private String nome;

    @Convert(converter = AtivoEnum.Mapeador.class)
    private AtivoEnum ativo;
}

Minha duvida no final ficou em saber se essa é a melhor pratica?

Existe uma maneira melhor de trabalhar dessa maneira onde o banco salva S e na aplicação trabalhamos com SIM ?

Ou hoje a melhor pratica seria gravar o nome completo no banco de dados igual ao enum tanto para esse caso quando para os demais como por exemplo de situação de um documento: ABERTO, PENDENTE, FECHADO, CANCELADO ?

1 resposta
solução!

Oi Thiago,

Para versões anteriores ao JPA 2.1, o JPA fornece apenas duas maneiras de lidar com enums: por nome ou por seu ordinal. E o JPA não suporta tipos personalizados. Portanto, usando o AttributeConverter é uma forma elegante de implementar essa feature.

Abraço!