Dúvidas sobre como salvar campo "Enum" no banco de dados

Boa tarde galera,

Gostaria de pedir a ajuda dos colegas pois não estou entendendo ainda muito bem essa parte sobre “Enum” e precisava salvar no banco de dados JDBC um valor contido nesse campo. Segue abaixo meu código para esclarecer melhor o que preciso.

Tenho uma classe Conta, aonde criei um Enum TipoConta {Conta_a_pagar, Conta_a_receber }

’ public class Conta {

private int id;
private int pessoaId;
private double valor;
private LocalDate dataVencimento;

/**
 * ENUM TIPO DE CONTA (PODENDO SER UMA CONTA A PAGAR, OU A RECEBER)
 */
public enum TipoConta {
    
    Conta_a_pagar(1), Conta_a_receber(2);
    
    private int valor;
    private String descricao;
    
    private TipoConta(int valor) {
        
        this.valor = valor;
        
        if(this.valor == 1) {
            
            this.setDescricao("Conta a Pagar");
        }
        else {
            this.setDescricao("Conta a Receber");
        }
    }

    private void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    
    private String getDescricao() {
        return this.descricao;
    }
}

`

Agora, essa é ação que é executada quando eu clico no meu botão “salvar” contido no formulário exibido para o usuário.

Conta c = new Conta(); ContaDao dao = new ContaDao(); c.setPessoaId(cbPessoa3.getSelectedIndex()); /* Sendo que não sei uma forma hoje de salvar o valor escolhido no combobox para enviar para minha classe DAO */ c.setTipoConta(cbTipoConta.getSelectedIndex()); dao.salvar(c);

A dúvida também ocorre na classe DAO

`
public void Salvar(Conta c) {
String sql = “insert into conta (tipoconta, pessoaId, categoriaId, subcategoriaId, valor, dataVencimento, statusConta) VALUES (?,?,?,?,?,?,?)”;

        try (PreparedStatement stmt = connection.prepareStatement(sql)){
           /* Como salvar esse campo no banco? */
           stmt.setString(1,c.getTipoConta().getDescricao());
            stmt.setInt(2,c.getPessoaId());

`

Desde já ficarei grato por qualquer ajuda.

primeiro de tudo você não está seguindo a convenção de uma enum, aonde o field tem que ser todo em maiusculo, segundo a maneira que na qual você montou o enum poderia ser feita desse jeito que vou demonstrar a baixo…

public enum TipoConta {
    
    PAGAR("Conta a Pagar"), RECEBER("Conta a Receber");
    
    private String descricao;
    
    private TipoConta(String descricao) {
        this.descricao= descricao;
    }

   public String getDescricao() {
        return this.descricao;
    }
      
}

e no banco você salva o toString() da enum, ou o ordinal() que é a posição do valor no enum, de preferencia eu sempre salvo com o toString, pois eventualmente você pode trocar a ordem ou acrescentar um novo campo entre os já existentes.

Obrigado darklordkamui,

Sua ajuda já foi de grande valia, consegui entender melhor sobre como trabalhar com Enum, porem ainda estou com uma dúvida referente a parte do meu formulário, tipo, como vou “setar” o valor para jogar isso para minha Dao salvar?

Por exemplo, hoje eu tenho um combobox no formulário o qual exibe os dados do Enum de forma que o usuário seleciona uma opção a qual é enviada para minha Dao e salva no banco. Porem não estou sabendo como manipular o dado selecionado no combobox referente a enum e enviando isso para a minha dao.

Mais uma vez agradeço demais por sua atenção.

qual tecnologia você esta usando? poderia postar o trecho do seu formulario? e como você está fazendo para exibir os valores da sua enum no formulario?

Então, estou trabalhando com Java SE, fazendo um aplicativo para controle de gastos com o Netbeans. Sobre o código, minha estrutura estava da seguinte forma, antes da última alteração que fiz:

Uma classe chamada Conta

`
public class Conta {

private int id;
private TipoConta tipoConta;
private int pessoaId;
private double valor;
private LocalDate dataVencimento;

/*  GETTERS E SETTERS */

`

Conforme mostrado na classe acima, eu tinha criado um Enum por fora, então eu chamava ele ai nessa classe colocando um set e um get pra ele. Sendo assim, quando eu clicava no botão “salvar” do meu formulário, eu utilizava esse setTipoConta pra poder repassar o valor “PAGAR” ou “RECEBER” por parâmetro, porem isso não dava certo porque estava errado ne.

Código do meu formulário hoje ao clicar no botão “Salvar”.

`

   if(cbPessoa.equals("") || cbTipoConta.equals("") || jformattedValor.getText().equals("") || jformattedVencimento.equals("")) {

        JOptionPane.showMessageDialog(null, "Todos os campos deverão ser devidamente preenchidos para que uma conta seja cadastrada");
    }
    else { 
        try {
            
            ContaDao dao = new ContaDao();
            c.setPessoaId(cbPessoa3.getSelectedIndex());
            
	/* NÃO SEI COMO CHAMAR O ENUM AQUI PRA PODER REPASSAR ALGUM VALOR PRA MINHA DAO */
            if(cbTipoConta.getSelectedIndex() == 1) {
                tipoConta.
            }

	....

	dao.salvar(c);
        catch(NumberFormatException | DateTimeParseException erro) {

            JOptionPane.showMessageDialog(null, "Erro\n" + erro);
        } 

`

Essa é a minha classe CONTA agora, após as alterações repassadas por você.

`
public class Conta {

private int id;
private int pessoaId;
private double valor;
private LocalDate dataVencimento;

 public enum TipoConta {

    PAGAR("Conta a Pagar"), RECEBER("Conta a Receber");

    private String descricao;

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

    public String getDescricao() {
       return this.descricao;
   }

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

    /* getters and setters */

}
`

bom imagino que você esteja então usando o JComboBox do swing,

caso esteja usando ele… seria simplemente utilizar o metodo
TipoConta tp = (TipoConta) cbTipoConta.getSelectedItem();

e você obteria o valor do enum selecionado na tela do usuario.

caso você esteja usando o JComboBox,
recomendo você montar ele assim…

JComboBox<TipoConta> combo = new JComboBox<>(TipoConta .values());

Deu certo darklordkamui,

Muito obrigado por sanar a minha dúvida.

1 curtida