Como implementar um conversor de atributos JPA

Postado em por Wolmir Cezer Garbin em Java | 100 Visualizações
Última atualização em:

O JPA 2.1 trouxe várias melhorias, uma delas é o conversor de atributos que permite ao desenvolvedor especificar métodos para converter entre o banco de dados e a representação Java de um atributo

Utilizando JPA 2.1 você pode criar conversores com muita facilidade. Para entender o que é um Converter vamos começar falando sobre o que não pode ser convertido.

O que podemos converter?

Um conversor suporta conversão de tipo de todos os atributos básicos definidos por classes de entidades, superclasses mapeadas ou classes incorporáveis.

As exceções que você nunca deve utilizar um conversor são os atributos de Id, atributos de versão, atributos de relacionamento e atributos anotados como Temporal ou Enumerations.

Preparando a tabela

Para o exemplo utilizaremos uma tabela representada abaixo:

ColunaTipo de Dados
IDInt
NOMEVarchar(40)
ATIVOVarchar(1)

Pode utilizar o SQL para criar esta tabela em seu banco de dados, no caso de utilizar o MySql:

create table PESSOA (
	ID int,
	NOME varchar(40),
	ATIVO varchar(1)
);

Utilize a tabela como opcional, você pode criar o conversor com base na sua necessidade.

Criando um JPA converter

Para este exemplo será criado um conversor para o campo ATIVO de Varchar para Boolean, o qual armazena os seguintes dados:

Valor 'S' convertido para true.
Valor 'N' convertido para false.
Valor null convertido para null.

Agora que temos tudo preparado, podemos criar o conversor:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter
public class BooleanSimNaoConverter implements AttributeConverter<Boolean, String> {

    @Override
    public String convertToDatabaseColumn(Boolean value) {
        return value ? "S": "N";
    }

    @Override
    public Boolean convertToEntityAttribute(String value) {
        if( "S".equals(value) )
            return true;
        else if( "N".equals(value) )
            return false;

        return null;
    }

}

Preste atenção que foi implementado o javax.persistence.AttributeConverter, o qual espera duas classes como generics, o valor da classe, neste caso o Boolean e o valor que gravado no banco de dados, neste caso String.

Esta interface requer a implementação de dois métodos, um converte para gravar as informações no banco de dados e outro para converter o valor no objeto do mapeamento JPA.

Usando o converter com Hibernate

Para utilizar o converter do JPA que criamos, podemos fazer da seguinte forma:

import javax.persistence.*;

@Entity
@Table(name = "PESSOA")
public class Pessoa {

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

    @Column
    private String nome;

    @Column
    @Convert(converter = BooleanSimNaoConverter.class)
    private Boolean ativo;

    // [...]
}

Note que utilizamos no campo ativo o tipo Boolean que é um objeto e não tipo primitivo, isso para que o valor suporte valores nullos, outro detalhe importante é o uso do @Convert que recebe a classe no parâmetro converter indicando qual converter será utilizado, para este caso o converter que criamos.


Conclusão

Com a utilização do converter podemos trabalhar de maneira mais limpa em todo o nosso código onde implementamos nossas regras de negócio, enquanto que no banco de dados podemos utilizar o valor que melhor se adquar para cada situação.

Ficou com dúvidas, deixe nos comentários!

Wolmir Cezer Garbin

Wolmir Cezer Garbin


Sou formado em Desenvolvimento de Sistemas para Internet pela faculdade Mater Dei e Pós graduado em Desenvolvimento de sistemas em Java pela UTFPR. Trabalho a mais de 9 anos com desenvolvimento em Java, Android e Web utilizando as principais tecnologias do mercado. Atuo como professor na faculdade Mater Dei, programador na Garbo Software e criador do Receitas de Código.

Ver mais

Posts relacionados


Code Conference

Esta é uma conferência de código realizada na cidade de Pato Branco para dissiminar tendências e informações sobre programação e novas tecnológias

Veja mais sobre o Code Conference

Publique seu post no Receitas de Código

Agora você pode publicar seu post no Receitas de Código e compartilhar seu conhecimento com muitas pessoas!

Quero publicar