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

6 respostas Resolvido
java
B

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.

6 Respostas

D

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.

B

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.

D

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?

B

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 */

}
`

D
Solucao aceita

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

B

Deu certo darklordkamui,

Muito obrigado por sanar a minha dúvida.

Criado 28 de janeiro de 2016
Ultima resposta 2 de fev. de 2016
Respostas 6
Participantes 2