Persistência enum JPA [RESOLVIDO]

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?

[code]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;
}

}[/code]

Obrigado

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;

}

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()

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

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

Blz…

vou trabalhar com ordinal mesmo obrigado a todos

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,

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

:smiley:

[code]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);
    }
};

}[/code]

abaixo o main

[code]public static void main(String[] args) {
// TODO code application logic here
List listaTeste = new LinkedList();
EnumTeste[] list = EnumTeste.values();
TreeSet ts = new TreeSet(EnumTeste.comparatorEnumTeste);
ts.addAll(Arrays.asList(list));

    for (EnumTeste teste : ts){
        listaTeste.add(teste);
    }
    System.out.println(listaTeste);
}[/code]

assim eu gravo o ordinal mas consigo a lista ordenada

o resultado é

[Ativo, Circulante, Passivo]