Anotação JPA para o tipo de texto PostgreSQL
1. Introdução
Neste tutorial rápido,we’ll explain how to manage the PostgreSQL TEXT type using the annotations defined by the JPA specification.
2. O tipo de texto no PostgreSQL
Ao trabalhar com PostgresSQL, podemos, periodicamente, precisar armazenar uma string com um comprimento arbitrário.
Para isso, o PostgreSQL fornece três tipos de caracteres:
-
CHAR (n)
-
VARCHAR (n)
-
TEXT
Infelizmente, o tipo TEXT não faz parte dos tipos gerenciados pelo padrão SQL. This means that if we want to use JPA annotations in our persistence entities, we may have a problem.
Isso ocorre porque a especificação JPA utiliza o padrão SQL. Consequentemente, édoesn’t define a simple way to handle this type of object using, for example, a @Text annotation.
Felizmente, temos algumas possibilidades para gerenciar o tipo de dados TEXT para um banco de dados PostgreSQL:
-
Podemos usar a anotação@Lob
-
Alternativamente, também podemos usar a anotação@Column, combinada com o atributocolumnDefinition
Vamos agora dar uma olhada nas duas soluções começando com a anotação@Lob.
3. @Lob
Como o nome sugere, um lob é umlargeobject. Em termos de banco de dados,lob columns are used to store very long texts or binary files.
Podemos escolher entre dois tipos de barras:
-
CLOB - um lob de caractere usado para armazenar textos
-
BLOB - um lob binário que pode ser usado para armazenar dados binários
Podemos usar a anotação JPA@Lob para mapear campos grandes para tipos de objetos de banco de dados grandes.
Quando usamos o registro@Lob em um atributo de tipoString, a especificação JPA diz que o provedor de persistência deve usar um objeto de tipo de caractere grande para armazenar o valor do atributo. Consequentemente, o PostgreSQL pode converter um lob de caractere em um tipo TEXT.
Vamos supor que temos um objeto de entidadeExam simples, com um campodescription, que pode ter um comprimento arbitrário:
@Entity
public class Exam {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Lob
private String description;
}
Usando a anotação@Lob no campo de descrição,we instruct Hibernate to manage this field using the PostgreSQL TEXT type.
4. @Column
Outra opção para gerenciar o tipo TEXTO é utilizar a anotação@Column, juntamente com a propriedadecolumnDefinition.
Vamos usar o mesmo objeto de entidadeExam novamente, mas desta vez adicionaremos um campo TEXT, que pode ter um comprimento arbitrário:
@Entity
public class Exam {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Lob
private String description;
@Column(columnDefinition="TEXT")
private String text;
}
Neste exemplo, usamos a anotação@Column(columnDefinition=”TEXT”). O uso do atributocolumnDefinition nos permite especificar o fragmento SQL que será usado ao construir a coluna de dados para este tipo.
5. Reunindo Tudo
Nesta seção, escreveremos um teste de unidade simples para verificar se nossa solução está funcionando:
@Test
public void givenExam_whenSaveExam_thenReturnExpectedExam() {
Exam exam = new Exam();
exam.setDescription("This is a description. Sometimes the description can be very very long! ");
exam.setText("This is a text. Sometimes the text can be very very long!");
exam = examRepository.save(exam);
assertEquals(examRepository.find(exam.getId()), exam);
}
Neste exemplo, começamos criando um novo objetoExam e persistindo-o em nosso banco de dados. Em seguida, recuperamos o objetoExam do banco de dados e comparamos o resultado com o exame original que criamos.
Para demonstrar o ponto, se modificarmos rapidamente o campo de descrição em nossa entidadeExam:
@Column(length = 20)
private String description;
Quando executarmos nosso teste novamente, veremos um erro:
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Value too long for column "TEXT VARCHAR(20)"
6. Conclusão
Neste tutorial, abordamos duas abordagens para o uso de anotações JPA com o tipo de texto PostgreSQL.
Começamos explicando para que o tipo de TEXTO é usado e então vimos como podemos usar as anotações JPA@Lobe@Columnto save String objects using the TEXT type defined by PostgreSQL.
Como sempre, o código-fonte completo do artigo está disponível emon GitHub.