Перейти к основному содержимому

Аннотация JPA для типа PostgreSQL TEXT

· 4 мин. чтения

1. Введение

В этом кратком руководстве мы объясним, как управлять типом PostgreSQL TEXT с помощью аннотаций, определенных спецификацией JPA .

2. Тип TEXT в PostgreSQL

При работе с PostgresSQL нам может периодически понадобиться хранить строку произвольной длины.

Для этого PostgreSQL предоставляет три типа символов:

  • СИМВОЛ(n)
  • ВАРЧАР(сущ.)
  • ТЕКСТ

К сожалению, тип TEXT не является частью типов, управляемых стандартом SQL. Это означает, что если мы хотим использовать аннотации JPA в наших сущностях постоянства, у нас могут возникнуть проблемы .

Это связано с тем, что спецификация JPA использует стандарт SQL. Следовательно, он не определяет простой способ обработки этого типа объекта с использованием, например, аннотации @Text .

К счастью, у нас есть несколько возможностей для управления типом данных TEXT для базы данных PostgreSQL:

  • Мы можем использовать аннотацию @Lob
  • В качестве альтернативы мы также можем использовать аннотацию @Column в сочетании с атрибутом columnDefinition.

Давайте теперь посмотрим на два решения, начиная с аннотации @Lob .

3. @Лоб

Как следует из названия, лоб — это большой объект . В терминах базы данных столбцы lob используются для хранения очень длинных текстов или двоичных файлов .

Мы можем выбрать один из двух видов лобов:

  • CLOB — символьный объект, используемый для хранения текстов.
  • BLOB — двоичный объект, который можно использовать для хранения двоичных данных.

Мы можем использовать аннотацию JPA @Lob для сопоставления больших полей с большими типами объектов базы данных.

Когда мы используем запись @Lob для атрибута типа String , спецификация JPA говорит, что поставщик постоянства должен использовать объект типа большого символа для хранения значения атрибута. Следовательно, PostgreSQL может преобразовать массив символов в тип TEXT.

Предположим, у нас есть простой объект сущности « Экзамен » с полем описания , которое может иметь произвольную длину:

@Entity
public class Exam {

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

@Lob
private String description;
}

Используя аннотацию @Lob в поле описания, мы указываем Hibernate управлять этим полем, используя тип PostgreSQL TEXT.

4. @Колонка

Другой вариант управления типом TEXT — использование аннотации @Column вместе со свойством columnDefinition .

Давайте снова воспользуемся тем же объектом сущности Exam , но на этот раз мы добавим поле TEXT, длина которого может быть произвольной:

@Entity
public class Exam {

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

@Lob
private String description;

@Column(columnDefinition="TEXT")
private String text;

}

В этом примере мы используем аннотацию @Column(columnDefinition="TEXT") . Использование атрибута columnDefinition позволяет нам указать фрагмент SQL, который будет использоваться при построении столбца данных для этого типа.

5. Объединяем все вместе

В этом разделе мы напишем простой модульный тест, чтобы убедиться, что наше решение работает:

@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);
}

В этом примере мы начинаем с создания нового объекта Exam и сохранения его в нашей базе данных. Затем мы извлекаем объект Exam из базы данных и сравниваем результат с исходным созданным нами экзаменом.

Чтобы продемонстрировать это, если мы быстро изменим поле описания в нашей сущности Exam :

@Column(length = 20)
private String description;

Когда мы снова запустим наш тест, мы увидим ошибку:

ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Value too long for column "TEXT VARCHAR(20)"

6. Заключение

В этом руководстве мы рассмотрели два подхода к использованию аннотаций JPA с типом PostgreSQL TEXT.

Мы начали с объяснения того, для чего используется тип TEXT, а затем увидели, как можно использовать аннотации JPA @Lob и @Column для сохранения объектов String с использованием типа TEXT, определенного в PostgreSQL.

Как всегда, полный исходный код статьи доступен на GitHub .