Annotazione JPA per il tipo di TESTO PostgreSQL

1. Introduzione

In questo breve tutorial, spiegheremo come gestire il tipo di TESTO PostgreSQL utilizzando le annotazioni definite dalla specifica JPA .

2. Il tipo TEXT in PostgreSQL

Quando si lavora con PostgresSQL potremmo, periodicamente, aver bisogno di memorizzare una stringa con una lunghezza arbitraria.

Per questo, PostgreSQL fornisce tre tipi di caratteri:

  • CHAR (n)
  • VARCHAR (n)
  • TESTO

Sfortunatamente, il tipo TEXT non fa parte dei tipi gestiti dallo standard SQL. Ciò significa che se vogliamo utilizzare le annotazioni JPA nelle nostre entità di persistenza, potremmo avere un problema .

Questo perché la specifica JPA utilizza lo standard SQL. Di conseguenza, non definisce un modo semplice per gestire questo tipo di oggetto utilizzando, ad esempio, un'annotazione @Text .

Fortunatamente, abbiamo un paio di possibilità per gestire il tipo di dati TEXT per un database PostgreSQL:

  • Possiamo usare l' annotazione @Lob
  • In alternativa, possiamo anche utilizzare l' annotazione @Column , combinata con l' attributo columnDefinition

Diamo ora un'occhiata alle due soluzioni che iniziano con l' annotazione @Lob .

3. @Lob

Come suggerisce il nome, un lob è l arge ob ject. In termini di database, le colonne lob vengono utilizzate per memorizzare testi molto lunghi o file binari .

Possiamo scegliere tra due tipi di pallonetti:

  • CLOB - un pallonetto di carattere utilizzato per memorizzare i testi
  • BLOB: un lob binario che può essere utilizzato per memorizzare dati binari

Possiamo utilizzare l' annotazione JPA @Lob per mappare campi di grandi dimensioni a tipi di oggetti di database di grandi dimensioni.

Quando utilizziamo il record @Lob su un attributo di tipo String , la specifica JPA dice che il provider di persistenza dovrebbe utilizzare un oggetto di tipo carattere di grandi dimensioni per memorizzare il valore dell'attributo. Di conseguenza, PostgreSQL può tradurre un lob di carattere in un tipo TEXT.

Supponiamo di avere un semplice oggetto entità Exam , con un campo di descrizione , che potrebbe avere una lunghezza arbitraria:

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

Utilizzando l' annotazione @Lob nel campo della descrizione, istruiamo Hibernate a gestire questo campo utilizzando il tipo TESTO PostgreSQL.

4. @Column

Un'altra opzione per la gestione del tipo TEXT consiste nell'usare l' annotazione @Column , insieme alla proprietà columnDefinition .

Usiamo di nuovo lo stesso oggetto entità Exam ma questa volta aggiungeremo un campo TEXT, che potrebbe essere di lunghezza arbitraria:

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

In questo esempio, utilizziamo l'annotazione @Column (columnDefinition = "TEXT") . L' utilizzo dell'attributo columnDefinition ci consente di specificare il frammento SQL che verrà utilizzato durante la costruzione della colonna di dati per questo tipo.

5. Portare tutto insieme

In questa sezione, scriveremo un semplice unit test per verificare che la nostra soluzione funzioni:

@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 questo esempio, iniziamo creando un nuovo oggetto Exam e rendendolo persistente nel nostro database. Quindi recuperiamo l' oggetto Exam dal database e confrontiamo il risultato con l'esame originale che abbiamo creato.

Per dimostrare il punto, se modifichiamo rapidamente il campo della descrizione nella nostra entità Esame :

@Column(length = 20) private String description; 

Quando eseguiremo nuovamente il nostro test, vedremo un errore:

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

6. Conclusione

In questo tutorial, abbiamo coperto due approcci per l'utilizzo delle annotazioni JPA con il tipo TEXT PostgreSQL.

Abbiamo iniziato spiegando a cosa serve il tipo TEXT e poi abbiamo visto come possiamo usare le annotazioni JPA @Lob e @Column per salvare oggetti String usando il tipo TEXT definito da PostgreSQL.

Come sempre, il codice sorgente completo dell'articolo è disponibile su GitHub.