1. введение
В этом кратком руководстве мы объясним, как управлять типом текста PostgreSQL с помощью аннотаций, определенных спецификацией JPA .
2. Тип ТЕКСТА в PostgreSQL
При работе с Postgresql нам периодически может потребоваться хранить строку произвольной длины.
Для этого PostgreSQL предоставляет три типа символов:
- CHAR(n)
- ВАРЧАР(n)
- ТЕКСТ
К сожалению, тип ТЕКСТА не является частью типов, управляемых стандартом SQL. Это означает, что если мы хотим использовать аннотации JPA в наших сущностях персистентности, у нас может возникнуть проблема .
Это связано с тем, что спецификация JPA использует стандарт SQL. Следовательно, он не определяет простой способ обработки этого типа объектов, используя, например, аннотацию @Text .
К счастью, у нас есть несколько возможностей для управления типом текстовых данных для базы данных PostgreSQL:
- Мы можем использовать аннотацию @Lob
- В качестве альтернативы мы также можем использовать аннотацию @Column в сочетании с атрибутом ColumnDefinition
Давайте теперь рассмотрим два решения, начинающиеся с аннотации @Lob .
3. @Lob
Как следует из названия, lob-это l arge ob ject. В терминах базы данных столбцы lob используются для хранения очень длинных текстов или двоичных файлов .
Мы можем выбрать один из двух видов полей:
- CLOB – символьный lob, используемый для хранения текстов
- BLOB – двоичный объект, который можно использовать для хранения двоичных данных
Мы можем использовать JPA @Lob аннотация для сопоставления больших полей с большими типами объектов базы данных.
Когда мы используем запись @Lob для атрибута String type, в спецификации JPA говорится, что поставщик персистентности должен использовать объект типа большого символа для хранения значения атрибута. Следовательно, PostgreSQL может преобразовать символьный lob в текстовый тип.
Предположим, у нас есть простой объект Exam entity с полем description , которое может иметь произвольную длину:
@Entity public class Exam { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Lob private String description; }
Используя аннотацию @Lob в поле описания, мы инструктируем Hibernate управлять этим полем с помощью текстового типа PostgreSQL.
4. Колонка @
Другим вариантом управления типом ТЕКСТА является использование @Колонка аннотация, вместе с Определение столбца собственность.
Давайте снова используем тот же объект Exam entity, но на этот раз мы добавим текстовое поле, которое может иметь произвольную длину:
@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 из базы данных и сравниваем результат с исходным экзаменом, который мы создали.
Чтобы продемонстрировать это, если мы быстро изменим поле описания в нашем экзамене сущности:
@Column(length = 20) private String description;
Когда мы снова запустим наш тест, мы увидим ошибку:
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Value too long for column "TEXT VARCHAR(20)"
6. Заключение
В этом уроке мы рассмотрели два подхода к использованию аннотаций JPA с типом текста PostgreSQL.
Мы начали с объяснения того, для чего используется тип ТЕКСТА, а затем мы увидели, как мы можем использовать аннотации JPA @Lob и @Column для сохранения String объектов, используя тип ТЕКСТА, определенный PostgreSQL.
Как всегда, полный исходный код статьи доступен через на GitHub .