Mapear Enum JPA

10 respostas
C

Olá, tenho um enum em java e uma entidade que tem um atributo com o tipo do enum, precisa mapear em JPA mas da maneira que consegui, quando gravo ele grava no banco o nome do atributo do enum
Quando gravo a pessoa no banco o campo sexo fica como: Masculino/Feminino, mas quero que fique “M” ou “F” pois vou criar a tabela e o campo sexo vai ser char(1).

public enum PessoaSexo {
    Masculino("M"),
    Feminino("F")

    private String valor;
    
    private PessoaSexo(String valor) {
        this.valor = valor;
    }
}

public class Pessoa() {
    @Enumerated(EnumType.STRING)
    PessoaSexo sexo;
}

10 Respostas

mauriciot.silva
@Enumerated(EnumType.STRING)

da forma q ta ela vai salvar o nome da constante..
mas se vc quer salvar apenas um caracters...
sem mudar o nome da constante

use

@Enumerated(EnumType.ORDINAL)
ai no banco ira ficar armazenado a posicao da sua constante.
C

mauriciot.silva:
@Enumerated(EnumType.STRING)

da forma q ta ela vai salvar o nome da constante…
mas se vc quer salvar apenas um caracters…
se mudar o nome da constante

use

ai no banco ira ficar armazenado a posicao da sua constante.

Mas é isso que eu não quero fazer, gravar posicoes das constantes do enum, quero que fique os caracteres: “M” para Masculino e “F” para Feminino e mantendo os nomes das constantes.

blackout

Cria um método get pra variável sexo no teu enum, e quando for passa-lo, chama o get.

Algo como:

PessoaSexo.getValue();

C

blackout:
Cria um método get pra variável sexo no teu enum, e quando for passa-lo, chama o get.

Algo como:

PessoaSexo.getValue();

Mas como eu chamaria este método get, então sobrescrevendo o toString funcionaria?
Por que se eu sobrescrever o toString quando dou um System.out.println(PessoaSexo.Feminino) imprime “F”, mas para gravar o JPA tenta inserir no banco o nome da constante.

public enum PessoaSexo {  
    Masculino("M"),  
    Feminino("F")  
  
    private String valor;  
      
    private PessoaSexo(String valor) {  
        this.valor = valor;  
    }  

    public String toString() {
        return valor;
    }
} 

System.out.println(PessoaSexo.Feminino); // Resulta em "F"
System.out.println(PessoaSexo.Masculino); // Resulta em "M"
Hebert_Coelho

cleverson_:
Por que se eu sobrescrever o toString quando dou um System.out.println(PessoaSexo.Feminino) imprime “F”, mas para gravar o JPA tenta inserir no banco o nome da constante.
Você tentou sobrescrevendo o toString?

C

jakefrog:
cleverson_:
Por que se eu sobrescrever o toString quando dou um System.out.println(PessoaSexo.Feminino) imprime “F”, mas para gravar o JPA tenta inserir no banco o nome da constante.
Você tentou sobrescrevendo o toString?

Sim eu sobreescrevi e esses são os resultados:

System.out.println(PessoaSexo.Feminino); // Resulta em "F"  
System.out.println(PessoaSexo.Masculino); // Resulta em "M"

Mas para persistir o JPA tenta persistir o nome da constante, não o valor que passo como parâmetro do construtor.

mauriciot.silva

entao faz isso

public enum PessoaSexo {  
   M ("Masculino"),  
    F("Feminino")  
  
    private String valor;  
      
    private PessoaSexo(String valor) {  
        this.valor = valor;  
    }  
}

nao ha outra forma....

lele_vader

E mantém o @Enumerated(Enum.String) eu acho

C
mauriciot.silva:
entao faz isso
public enum PessoaSexo {  
   M ("Masculino"),  
    F("Feminino")  
  
    private String valor;  
      
    private PessoaSexo(String valor) {  
        this.valor = valor;  
    }  
}

nao ha outra forma....

Se não tem como gravar um char para uma constante, entao temos que de certa forma moldar o banco de dados de acordo com a maneira que o framework trabalha.
No caso que citei ate não teria tanta importância, pois serão sempre dois valores e os nomes não são longos, mas vai ter casos em que teria varias constantes com nomes bem mais longos, e no banco eu teria que gravar tudo como string.

mauriciot.silva

Entao vdd tem ate um artigo no blog da caelum
sobre JPA vs DataBases

o mais importante eh q as informacoes estejam
acessivel para o framework (JPA/Hibernate)


a nao ser que vc queira voltar no tempo e usar JDBC.
ai fica ao seu criterio

vlw
espero ter ajudado

Criado 2 de julho de 2012
Ultima resposta 2 de jul. de 2012
Respostas 10
Participantes 5