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 .