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
Última atualização em: | 8695 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:
Coluna | Tipo de Dados |
---|---|
ID | Int |
NOME | Varchar(40) |
ATIVO | Varchar(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 tipoBoolean
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âmetroconverter
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.