Рубрики
Без рубрики

Аннотация JPA для текстового типа PostgreSQL

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

Автор оригинала: baeldung.

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 .