Salvar enum no banco a partir de determinado numero

7 respostas Resolvido
L

Pessoa, estou tentando fazer um enum em java, porém preciso que salve no banco a partir da lista que defeni, com seu numero, mas no banco esta salvando a partir do zero, gostaria de saber se tem como salvar do tipo que criei. Segue o código

public enum TipoVinculo {

COMPROMISSÁRIO(3, "Compromissário"),
ESTUDA(4, "Estuda"),
LOCATÁRIO(5, "Locatário"),
MIGRANTE(6, "Migrante"),
PROPRIETÁRIO(2, "Proprietário"),
TRABALHA(1, "Trabalha");


@Enumerated(EnumType.ORDINAL)
public int id;
public String descricao;

private TipoVinculo(int id, String descricao) {
    this.id = id;
    this.descricao = descricao;
}

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

public String getDescricao() {
    return descricao;
}

public int getId() {
    return id;
    }   
}

No caso esta desse jeito porque quero mostra a descrição e tem que ser em ordem alfabética, mas tipo o compromissario teria que gravar 3 no banco, mas esta gravando como 0. Alguém sabe a solução ?

7 Respostas

C

Boa tarde Leandro,

Acredito que o problema está relacionado ao lugar onde vc está disponibilizando esse enum.

Poderia postar a classe ou entidade aonde será utilizado?

Att.,

L

Ok. A classe onde estou chamando ele na classe

package br.com.eddydata.entidade.rechidrico;

import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author Leandro
 */
@Embeddable
public class PessoaImovelPK implements Serializable{
    
    @Column(name = "id_pessoa")
    private Integer idPessoa;

@Column(name = "id_imovel")
private Integer idImovel;

@Column(name = "id_exercicio_pk")
private Integer idExercicio;

@Column(name = "tipo_vinculo")
private TipoVinculo tipoVinculo;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "data_vinculo")
private Date dataVinculo;

public Integer getIdPessoa() {
    return idPessoa;
}

public void setIdPessoa(Integer idPessoa) {
    this.idPessoa = idPessoa;
}

public Integer getIdImovel() {
    return idImovel;
}

public void setIdImovel(Integer idImovel) {
    this.idImovel = idImovel;
}

public Integer getIdExercicio() {
    return idExercicio;
}

public void setIdExercicio(Integer idExercicio) {
    this.idExercicio = idExercicio;
}

public TipoVinculo getTipoVinculo() {
    return tipoVinculo;
}

public void setTipoVinculo(TipoVinculo tipoVinculo) {
    this.tipoVinculo = tipoVinculo;
}

public Date getDataVinculo() {
    return dataVinculo;
}

public void setDataVinculo(Date dataVinculo) {
    this.dataVinculo = dataVinculo;
}
    
@Override
public int hashCode() {
    int hash = 7;
    hash = 53 * hash + Objects.hashCode(this.idPessoa);
    return hash;
}

@Override
public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final PessoaImovelPK other = (PessoaImovelPK) obj;
    if (!Objects.equals(this.idPessoa, other.idPessoa)) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "PessoaImovelPK{" + "idPessoa=" + idPessoa + '}';
}    
}
C

No atributo tipoVinculo vc deve colar a anotação @Enumerated(EnumType.ORDINAL), retirando ela do enum criado antes, pois assim a entidade gravará no banco a posição ordinal que vc colocou no enum. Teste assim e veja se funciona.

Att.,

L

c.rangel, fiz como vc falou, porem continua, gravando no banco na ordem começando do zero

E

Ola, tive esse mesmo problema, resolvi com esse link (no post 7) existe um metodo parse que faz esse trabalho de conversão. link

Credito para @fpierin

L
Solucao aceita

Ok. Obrigado Eduardo_Maranata10, fiz de acordo com o link e consegui, porém quando eu fazia uma alteração ou uma cadastro para null ele estava retornando zero no banco e não nulo, ai em vez de int passei para Integer e funcionou perfeito. O código ficou assim.

public enum TipoVinculo {

COMPROMISSÁRIO(3, "Compromissário"),
ESTUDA(4, "Estuda"),
LOCATÁRIO(5, "Locatário"),
MIGRANTE(6, "Migrante"),
PROPRIETÁRIO(2, "Proprietário"),
TRABALHA(1, "Trabalha");

public Integer id;
public String descricao;

private TipoVinculo(Integer id, String descricao) {
    this.id = id;
    this.descricao = descricao;
}

  public String getDescricao() {
    return descricao;
}

public Integer getId() {
    return id;
}

public static TipoVinculo parse(Integer id){
    TipoVinculo tipoVinculo = null;
    for(TipoVinculo item : TipoVinculo.values()){
        if(Objects.equals(item.getId(), id)){
            tipoVinculo = item;
            break;
        }
    }
    return tipoVinculo;
}



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

}

e na classe que chama o enum ficou assim:

@Column(name = "tipo_vinculo")
    private Integer tipoVinculo;

 public TipoVinculo getTipoVinculo() {
        return TipoVinculo.parse(this.tipoVinculo);
    }

public void setTipoVinculo(TipoVinculo tipoVinculo) {
    if(tipoVinculo!=null){
        this.tipoVinculo = tipoVinculo.getId();
    }else{
        this.tipoVinculo = null;
    }
}
E

Fico feliz por ter ajudado, qualquer coisa estamos aqui, vou levar em consideração a sua mudança para o meu código, Abraço

Criado 25 de julho de 2016
Ultima resposta 27 de jul. de 2016
Respostas 7
Participantes 3