JPA-Annotation für den PostgreSQL-TEXT-Typ

1. Einleitung

In diesem kurzen Tutorial erklären wir, wie der PostgreSQL TEXT-Typ mithilfe der in der JPA-Spezifikation definierten Anmerkungen verwaltet wird .

2. Der TEXT-Typ in PostgreSQL

Bei der Arbeit mit PostgresSQL müssen wir möglicherweise regelmäßig einen String mit einer beliebigen Länge speichern.

Dafür bietet PostgreSQL drei Zeichentypen:

  • CHAR (n)
  • VARCHAR (n)
  • TEXT

Leider gehört der TEXT-Typ nicht zu den Typen, die vom SQL-Standard verwaltet werden. Dies bedeutet, dass wir möglicherweise ein Problem haben, wenn wir JPA-Annotationen in unseren Persistenzentitäten verwenden möchten .

Dies liegt daran, dass die JPA-Spezifikation den SQL-Standard verwendet. Infolgedessen wird keine einfache Methode zum Behandeln dieses Objekttyps definiert, z. B. mithilfe einer @ Text- Annotation.

Glücklicherweise haben wir einige Möglichkeiten, den TEXT-Datentyp für eine PostgreSQL-Datenbank zu verwalten:

  • Wir können die @ Lob- Annotation verwenden
  • Alternativ können wir auch die Annotation @Column in Kombination mit dem Attribut columnDefinition verwenden

Schauen wir uns nun die beiden Lösungen an, die mit der Annotation @Lob beginnen .

3. @Lob

Wie der Name schon sagt, ein lob ein l arge ob ject. In Bezug auf die Datenbank werden Lob-Spalten verwendet, um sehr lange Texte oder Binärdateien zu speichern .

Wir können aus zwei Arten von Lobs wählen:

  • CLOB - ein Zeichen-Lob, in dem Texte gespeichert werden
  • BLOB - ein binäres Lob, das zum Speichern von binären Daten verwendet werden kann

Wir können die JPA @ Lob- Annotation verwenden, um große Felder großen Datenbankobjekttypen zuzuordnen .

Wenn wir den @ Lob- Datensatz für ein String- Typ-Attribut verwenden, besagt die JPA-Spezifikation, dass der Persistenzanbieter ein großes Zeichentypobjekt verwenden sollte, um den Wert des Attributs zu speichern. Folglich kann PostgreSQL einen Zeichen-Lob in einen TEXT-Typ übersetzen.

Nehmen wir an, wir haben ein einfaches Exam- Entity-Objekt mit einem Beschreibungsfeld , das eine beliebige Länge haben kann:

@Entity public class Exam { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Lob private String description; } 

Unter Verwendung der Annotation @Lob im Beschreibungsfeld weisen wir Hibernate an, dieses Feld mit dem Typ PostgreSQL TEXT zu verwalten.

4. @Column

Eine weitere Option zum Verwalten des TEXT-Typs besteht darin, die Annotation @Column zusammen mit der Eigenschaft columnDefinition zu verwenden .

Verwenden wir wieder dasselbe Exam- Entity-Objekt, aber dieses Mal fügen wir ein TEXT-Feld hinzu, das eine beliebige Länge haben kann:

@Entity public class Exam { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Lob private String description; @Column(columnDefinition="TEXT") private String text; }

In diesem Beispiel verwenden wir die Annotation @Column (columnDefinition = ”TEXT”) . Mit dem Attribut columnDefinition können wir das SQL-Fragment angeben, das beim Erstellen der Datenspalte für diesen Typ verwendet wird.

5. Alles zusammenbringen

In diesem Abschnitt schreiben wir einen einfachen Komponententest, um zu überprüfen, ob unsere Lösung funktioniert:

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

In diesem Beispiel erstellen wir zunächst ein neues Prüfungsobjekt und speichern es in unserer Datenbank. Wir holen dann die Prüfung Objekt aus der Datenbank und vergleichen das Ergebnis mit den Original - Prüfungs wir erstellt.

Um den Punkt zu demonstrieren, wenn wir das Beschreibungsfeld in unserer Prüfungsentität schnell ändern :

@Column(length = 20) private String description; 

Wenn wir unseren Test erneut ausführen, wird ein Fehler angezeigt:

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

6. Fazit

In diesem Tutorial haben wir zwei Ansätze für die Verwendung von JPA-Annotationen mit dem PostgreSQL TEXT-Typ behandelt.

Wir haben zunächst erklärt, wofür der TEXT-Typ verwendet wird, und dann gesehen, wie wir die JPA-Annotationen @Lob und @Column verwenden können , um String- Objekte mit dem von PostgreSQL definierten TEXT-Typ zu speichern .

Wie immer ist der vollständige Quellcode des Artikels auf GitHub verfügbar.