Enum e JDBC!

7 respostas
JorjaoCorreia

Estou com uma duvida, nao estou conseguindo fazer funcionar as minhas classes Enum usando JDBC,
os classes Enums funcionam normalmente usando o JDBC ou só com o JPA?

Obrigado.

7 Respostas

B

Poderia ser mais claro um pouco no problema que você está encontrando? Pois me parece algo simples, dependendo da forma como tu estás persistindo o enum.

Na verdade me parece simples até independente da forma, pois se for um relacionamento um para um com uma outra entidade e o enum for uma coluna numa tabela, tu simplesmente pega o valor da coluna e gera o enum especifico:

enum Apple {  
  A, B, C, D, E 
} 
 
public class MainClass { 
  public static void main(String args[])  
  { 
    Apple ap; 
 
    System.out.println("Here are all Apple constants"); 

    Apple allapples[] = Apple.values(); 
    for(Apple a : allapples) 
      System.out.println(a); 
 
    System.out.println(); 
    
    ap = Apple.valueOf("C"); 
    System.out.println("ap contains " + ap); 
 
  } 
}

Só um exemplo que eu peguei da internet onde usam o valueOf para gerar o enum desejado. Ali tu substituiria com o valor recuperado da coluna. Para os outros relacionamentos (1 pra n, etc.) seria a mesma coisa...

Isso se o enum estiver com sendo persistido como String, se tiver sendo sendo persistido como número daí vai ter q tratar um pouco diferente, mas nada demais tb...

JorjaoCorreia

Na verdade nem sei se é o enum msm a causa do problema, deu um erro aqui que eu nao sei qual é, achei que pudesse ser o enum, no sistema ta assim:

criei uma classe enum:

package sgia.enums;

public enum TipoCadastro {
    CLIENTE, FUNCIONARIO, FORNECEDOR
}
e na hora da inserção eu tratei o enum da seguinte forma:
con.setParam(7, p.getTipoCadastro().toString());

assim esta correto?

Guitar_Men

É mas fácil vc colar o erro ai.

ViniGodoy

Você tem algumas possibilidades.

1. Gravar o name() do enum. Não gosto disso pq complica o refactoring;
2. Gravar o ordinal do enum. Acho ainda pior que gravar o name();
3. Criar um campo ID para seu enum. Acho a melhor opção.

Aí fica assim:
public enum TipoCadastro {  
   CLIENTE(1), FUNCIONARIO(2), FORNECEDOR(3);

   private int id;

   private TipoCadastro(int id) {
      this.id = id;
   }

   public int getId() { return id; }
   public static TipoCadastro porId(int id) {
      for (TipoCadastro c : values()) {
         if (c.getId() == id) return c;
         return null;
      }
   }
}
Aí vc salva só o ID no JDBC:
con.setInt(7, p.getTipoCadastro().getId());
E carrega assim:
TipoCadastro c = TipoCadastro.porId(rs.getInt("tipoCadastro"));

O id pode parecer redundante com o ordinal, mas não é. Você com o tempo, você pode decidir apagar um item do enum, ou incluir um no meio, e aí a ordem dos demais irá mudar, mas o ID não.

JorjaoCorreia

tem como eu declarar uma variavel em uma classe enum?

da erro nessa declaração de variavel :x

ViniGodoy

Tem sim.

Que erro?

JorjaoCorreia

Consegui resolver cara, brigado =)

Criado 11 de agosto de 2010
Ultima resposta 13 de ago. de 2010
Respostas 7
Participantes 4