Anotação JPA para o tipo de texto PostgreSQL

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.