Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

JPA - Mapear Enumeration com Banco de dados Legado

Olá a todos. Estudando JPA gostei da ideia de usar enumerações para mapear os atributos em minha classe, o código fica bem elegante e orientado a objetos, mas tenho dúvidas se posso ter enumerações no código java refletindo o banco de dados, vou explicar melhor com a situação:

tenho um banco legado, nesse banco tenho as tabelas situacao_remessa, periodo e tipo_remessa, acontece que os valores dessas tabelas são fixos, pelo menos em 7 anos que estou na empresa esses valores nunca mudaram, exemplo:


situacao

id nome


1 aberta

2 enviada


tipo_remessa

id nome


1 rgf executivo mun

2 rgf lesgilativo mun

3 rreo executivo mun

periodo

id nome


1 primeiro bimestre

2 segundo bimestre

3 terceiro bimestre

atualmente mapeio a entidade remessa dessa forma:

@Entity
public class Remessa{

@Id
private Long id;

@ManyToOne
private TipoRemessa tipoRemessa;

@ManyToOne
private Periodo periodo;

@ManyToOne
private Situacao situacao;

}

como estes valores são fixos, no código ficaria bem mais legal utilizar enumerações que ficar mapeando ManytoOne, pois sempre que inicializo um objeto remessa, eu tenho que inicializar ela com uma situacao, tipo e periodo e do jeito que está sempre tenho que ir no banco, outra coisa chata é quando quero mudar o status, sempre tenho que executar a consulta, utilizando enums eu faria apenas this.situacao = Situacao.ENVIADA , bem mais simples.

Gostaria de substituir este ManyToOne por Enums, mas nessa tabela remessa já tem dados com chaves estrangeiras para as tabelas citadas acima,então preciso de uma forma de utilizar as enums no código mas que estas possam refletir o banco já existentes, ou seja quando eu fizer this.situacao = Situacao.ENVIADA ele deve salvar o valor "2" na tabela remessa no campo situacao_id, é possível ?

4 respostas

Não seria o caso de aplicar os valores para cada um dos itens da enum, como em http://www.devmedia.com.br/tipos-enum-no-java/25729

Ricardo, Faz o seguinte teste: Cria o enum SituacaoEnum com os valores ABERTA(1), ENVIADA(2) e no teu mapeamento altera o tipo para SituacaoEnum e a anotação fica assim: @Enumerated(EnumType.ORDINAL)

Testa e da um retorno se deu certo.

Valeu

Olá gregory, o problema de usar ordinal é que ele sempre vai pegar a posição da enum , não importa se eu fizer ABERTA(1) , quando ele salvar ele vai salvar 0 e enciada ele vai salvar 1, e com ordinal tem o ploblema caso mude as posições.

solução!

e ai galera, apenas definir o id na enum não é o suficiente, mas com uma pequena gambi dá pra resolver, testei aqui com o exemplo do curso e crieiuma tabela de tipo_movimentacao que temuma fk para movimentacao

public enum TipoMovimentacao {

    ENTRADA(1), SAIDA(2);


    private int id;

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


    public static TipoMovimentacao getType(Integer id) {

        if (id == null) {
            return null;
        }

        for (TipoMovimentacao tipoMovimentacao : TipoMovimentacao.values()) {
            if (id.equals(tipoMovimentacao.getId())) {
                return tipoMovimentacao;
            }
        }
        throw new IllegalArgumentException("Não existe nenhum valor correspondente para " + id);
    }

    public int getId() {
        return id;
    }


}


@Entity
public class Movimentacao {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private BigDecimal valor;

    @Column(name="tipo_movimento")
    private Integer tipoMovimentoId;

    //@Enumerated(EnumType.STRING)
    //private TipoMovimentacao tipoMovimentacao;

    @Temporal(TemporalType.DATE)
    private Calendar data;

    private String descricao;

    @ManyToOne
    private Conta conta;


    @Transient
    public TipoMovimentacao getPosition() {
        return TipoMovimentacao.getType(this.tipoMovimentoId);
    }

    public void setTipoMovimentacao(TipoMovimentacao tipoMovimentacao) {

        if (tipoMovimentacao == null) {
            this.tipoMovimentoId = null;
        } else {
            this.tipoMovimentoId = tipoMovimentacao.getId();
        }
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public BigDecimal getValor() {
        return valor;
    }

    public void setValor(BigDecimal valor) {
        this.valor = valor;
    }

/*    public TipoMovimentacao getTipoMovimentacao() {
        return tipoMovimentacao;
    }

    public void setTipoMovimentacao(TipoMovimentacao tipoMovimentacao) {
        this.tipoMovimentacao = tipoMovimentacao;
    }*/

    public Calendar getData() {
        return data;
    }

    public void setData(Calendar data) {
        this.data = data;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Conta getConta() {
        return conta;
    }

    public void setConta(Conta conta) {
        this.conta = conta;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Movimentacao other = (Movimentacao) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}

public class TesteJPAEnum {

    public static void main(String[] args) {

        EntityManager manager = new JPAUtil().getEntityManager();
        manager.getTransaction().begin();
        Conta conta = manager.find(Conta.class,4);
        Movimentacao movimentacao = new Movimentacao();
        movimentacao.setData(Calendar.getInstance());
        movimentacao.setDescricao("Curso de Java");
        movimentacao.setTipoMovimentacao(TipoMovimentacao.SAIDA);
        movimentacao.setValor(new BigDecimal("600"));
        movimentacao.setConta(conta);
        manager.persist(movimentacao);
        manager.getTransaction().commit();
        manager.close();

    }
}

não fica lá muito elegante mas resolve, obrigado!!