Anotácia JPA pre typ textu PostgreSQL

1. Úvod

V tomto rýchlom návode vysvetlíme si, ako spravovať typ PostgreSQL TEXT pomocou anotácií definovaných v špecifikácii JPA.

2. Typ TEXT v PostgreSQL

Pri práci s PostgresSQL budeme možno musieť pravidelne ukladať reťazce s ľubovoľnou dĺžkou.

PostgreSQL preto ponúka tri typy znakov:

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

Typ TEXT bohužiaľ nie je súčasťou typov, ktoré sú spravované štandardom SQL. To znamená, že ak chceme v našich entitách perzistencie používať anotácie JPA, môžeme mať problém.

Je to tak preto, lebo špecifikácia JPA využíva štandard SQL. V dôsledku toho nedefinuje jednoduchý spôsob zaobchádzania s týmto typom objektov pomocou napríklad a @Text anotácia.

Našťastie máme niekoľko možností pre správu dátového typu TEXT pre databázu PostgreSQL:

  • Môžeme použiť @Lob anotácia
  • Prípadne môžeme použiť aj @ Stĺpec anotácia v kombinácii s stĺpecDefinícia atribút

Poďme sa teraz pozrieť na dve riešenia začínajúce sa na @Lob anotácia.

3. @Lob

Ako už názov napovedá, lob je a large objekt. Z hľadiska databázy stĺpce lob sa používajú na ukladanie veľmi dlhých textov alebo binárnych súborov.

Môžeme si vybrať z dvoch druhov lalokov:

  • CLOB - znakový lob používaný na ukladanie textov
  • BLOB - binárny lob, ktorý možno použiť na ukladanie binárnych údajov

Môžeme použiť JPA @Lob anotácia na mapovanie veľkých polí na veľké typy databázových objektov.

Keď použijeme @Lob záznam na a String type atribút, špecifikácia JPA hovorí, že poskytovateľ perzistencie by mal na uloženie hodnoty atribútu použiť objekt typu veľký znak. PostgreSQL teda dokáže preložiť znakový lob do typu TEXT.

Predpokladajme, že máme jednoduchý Skúška objekt entity, s a popis pole, ktoré môže mať ľubovoľnú dĺžku:

@Entity skúška verejnej triedy {@Id @GeneratedValue (strategy = GenerationType.AUTO) súkromné ​​dlhé ID; @Lob súkromný popis reťazca; } 

Pomocou @Lob anotácia v poli popisu, dáme Hibernate pokyn, aby spravoval toto pole pomocou typu PostgreSQL TEXT.

4. @ Stĺpec

Ďalšou možnosťou správy typu TEXT je použitie @ Stĺpec anotácia spolu s stĺpecDefinícia nehnuteľnosť.

Použime to isté Skúška objekt entity znova, ale tentokrát pridáme pole TEXT, ktoré môže mať ľubovoľnú dĺžku:

@Entity skúška verejnej triedy {@Id @GeneratedValue (strategy = GenerationType.AUTO) súkromné ​​dlhé ID; @Lob súkromný popis reťazca; @Column (columnDefinition = "TEXT") súkromný textový reťazec; }

V tomto príklade používame anotáciu @Column (columnDefinition = ”TEXT”). Pomocou stĺpecDefinícia Atribút nám umožňuje určiť fragment SQL, ktorý sa použije pri konštrukcii údajového stĺpca pre tento typ.

5. Spojíme to všetko

V tejto časti napíšeme jednoduchý test jednotky na overenie funkčnosti nášho riešenia:

@Test public void givenExam_whenSaveExam_thenReturnExpectedExam () {skúška na skúšku = nová skúška (); exam.setDescription ("Toto je popis. Niekedy môže byť popis veľmi dlhý!"); exam.setText ("Toto je text. Niekedy môže byť text veľmi dlhý!"); skúška = examRepository.save (skúška); assertEquals (examRepository.find (exam.getId ()), skúška); }

V tomto príklade začneme vytvorením nového Skúška namietať a uchovať ho v našej databáze. Potom získame Skúška objekt z databázy a porovnajte výsledok s pôvodnou skúškou, ktorú sme vytvorili.

Na ukážku veci, ak rýchlo upravíme pole popisu na našom Skúška subjekt:

@Column (length = 20) private String description; 

Po opätovnom spustení testu sa zobrazí chyba:

CHYBA o.h.e.jdbc.spi.SqlExceptionHelper - hodnota príliš dlhá pre stĺpec „TEXT VARCHAR (20)“

6. Záver

V tomto tutoriáli sme sa zaoberali dvoma prístupmi k používaniu anotácií JPA s typom PostgreSQL TEXT.

Začali sme vysvetlením, na čo sa používa typ TEXT, a potom sme videli, ako môžeme používať anotácie JPA @Lob a @ Stĺpec zachrániť String objekty využívajúce typ TEXT definovaný PostgreSQL.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found