Como implementar um conversor de atributos JPA

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

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Java - TUTORIAL

Última atualização em: | 8300 Visualizações

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!


Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.


Apoiadores

Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!