Persistência enum JPA [RESOLVIDO]

7 respostas
worldfernando

Olá pessoal,

Seguinte eu estou precisando armazenar esse ENUM abaixo, porém gostaria de gravar no banco somente o ID alguém poderia me dar um auxilio?

public enum EnumFormaPagamento {
    
    AVISTA(1,"À vista"),
    PRAZO(2,"À prazo"),
    OUTROS(3,"Outros");
    
    private int id;
    private String descricao;

    private EnumFormaPagamento(int id, String descricao) {
        this.id = id;
        this.descricao = descricao;
    }

    public String getDescricao() {
        return descricao;
    }

    public int getId() {
        return id;
    }

    @Override
    public String toString() {
        return this.descricao;
    }
}

Obrigado

7 Respostas

ddark.emanu

Trabalho com enuns dessa maneira ;

public enum FormaPagamento{
    
    AVISTA("A Vista"),
    PRAZO("A Prazo"),
    OUTRO("Outro");
    
    private String descricao;

    private StatusSolicitacao(String descricao) {
    
        this.descricao = descricao;
        
    }

Na classe onde vou chamar a ENUM uso a annotation @Enumerated , caso queira salvar a posição da enum (iniciando por 0) ou @Enumerated(EnumType.STRING) caso queira salvar a descrição

ex :

public class Venda {

...
    @Enumerated 
    private FormaPagamento formaPagamento;

}
worldfernando

Então amigo é quase isso mas ocorre um problema de gravar a posição, pois caso eu adicione mais uma opção do enum entres os já existentes quando eu for resgatar do banco pode vir errado, então eu gostaria de gravar o meu getId()

worldfernando

caso não tenha como fazer vou ter que gravar a posição mesmo.

Cristiano_de_Barros

Olá,

Infelizmente isto que você deseja fazer não é possível.
Porém, com a anotação @Enumerated, você pode escolher entre duas maneiras de armazenamento no banco, cada uma com seu prós e contras:

@Enumerated(EnumType.STRING)
Grava o nome do enum no banco de dados. No seu exemplo seriam persistidos os valores AVISTA, PRAZO, etc.
A vantagem deste é que você pode trocar a ordem dos enums a qualquer momento e sua aplicação continuará funcionando sem problemas, e a desvantagem é que você não poderá mexer nos nomes.

@Enumerated(EnumType.ORDINAL) (Que é o default)
Grava a ordem do enum no banco de dados. No seu exemplo seriam persistidos os valores 0 para AVISTA, 1 para PRAZO, etc.
A vantagem deste em relação ao anterior, é que você pode renomear os enums a qualquer momento e sua aplicação continuará funcionando sem problemas, porém desta maneira você não poderá mudar a ordem dos enums.

Seja qual for a maneira escolhida, não é tão problemático criar um novo valor para um enum, desde que você respeite a forma que está sendo persistido no banco de dados.

Espero ter ajudado!
Abraço

worldfernando

Blz…

vou trabalhar com ordinal mesmo obrigado a todos

fpierin

Olá worldfernando,

Como o Cristiano falou, só por anotações você não vai conseguir fazer o que deseja, no entanto você poderia fazer o seguinte:

public enum EnumFormaPagamento {
    
    AVISTA(1,"À vista"),
    PRAZO(2,"À prazo"),
    OUTROS(3,"Outros");
    
    private int id;
    private String descricao;

    private EnumFormaPagamento(int id, String descricao) {
        this.id = id;
        this.descricao = descricao;
    }

    public String getDescricao() {
        return descricao;
    }

    public int getId() {
        return id;
    }
    
    public static EnumFormaPagamento parse(int id) {
    	EnumFormaPagamento enumFormaPagamento = null; 
        for (EnumFormaPagamento item : EnumFormaPagamento.values()) {
            if (item.getId() == id) {
            	enumFormaPagamento = item;
                break;
            }
        }
        return enumFormaPagamento;
    }

    @Override
    public String toString() {
        return this.descricao;
    }
}

E então na classe em que você persiste esse enumerado você declara :

@Column
private int enumId;

e os getters e setters ficariam:

public EnumFormaPagamento getEnumFormaPagamento () {
     return EnumFormaPagamento.parse(this.enumId);
}

public void setEnumFormaPagamento(EnumFormaPagamento enumFormaPagamento) {
     this.enumId = enumFormaPagamento.getId();
}

Abcs,

worldfernando

Então pessoal eu compartilho abaixo a solução que conseguimos por aqui espero que ajude outros com o mesmo problema um abraço a todos

:D

public enum EnumTeste {

    circulante("Circulante"),
    passivo("Passivo"),
    ativo("Ativo");
    
    private String descricao;

    private EnumTeste(String descricao) {
        this.descricao = descricao;
    }

    @Override
    public String toString() {
        return this.descricao;
    }

    public final static Comparator comparatorEnumTeste = new Comparator<EnumTeste>() {

        @Override
        public int compare(EnumTeste t, EnumTeste t1) {
            return t.descricao.compareTo(t1.descricao);
        }
    };
}

abaixo o main

public static void main(String[] args) {
        // TODO code application logic here
        List<EnumTeste> listaTeste = new LinkedList<EnumTeste>();
        EnumTeste[] list = EnumTeste.values();        
        TreeSet<EnumTeste> ts = new TreeSet<EnumTeste>(EnumTeste.comparatorEnumTeste);
        ts.addAll(Arrays.asList(list));     
        
        for (EnumTeste teste : ts){
            listaTeste.add(teste);
        }
        System.out.println(listaTeste);
    }

assim eu gravo o ordinal mas consigo a lista ordenada

o resultado é

[Ativo, Circulante, Passivo]

Criado 18 de julho de 2011
Ultima resposta 20 de jul. de 2011
Respostas 7
Participantes 4