JPA-merknad for PostgreSQL TEKST-typen
1. Introduksjon
I denne raske opplæringen, Vi forklarer hvordan du administrerer PostgreSQL TEXT-typen ved hjelp av kommentarene som er definert av JPA-spesifikasjonen.
2. TEKST-typen i PostgreSQL
Når vi jobber med PostgresSQL, kan det hende at vi trenger å lagre en streng med en vilkårlig lengde.
For dette gir PostgreSQL tre karaktertyper:
- CHAR (n)
- VARCHAR (n)
- TEKST
Dessverre er ikke TEKST-typen en del av typene som administreres av SQL-standarden. Dette betyr at hvis vi vil bruke JPA-merknader i våre utholdenhetsenheter, kan vi ha et problem.
Dette er fordi JPA-spesifikasjonen bruker SQL-standarden. Følgelig, det definerer ikke en enkel måte å håndtere denne typen objekter på, for eksempel a @Tekst kommentar.
Heldigvis har vi et par muligheter for å administrere TEXT-datatypen for en PostgreSQL-database:
- Vi kan bruke @Lob kommentar
- Alternativt kan vi også bruke @Kolonne kommentar, kombinert med columnDefinition Egenskap
La oss nå ta en titt på de to løsningene som begynner med @Lob kommentar.
3. @Lob
Som navnet antyder, er en lob en large object. I databasetermer, lob kolonner brukes til å lagre veldig lange tekster eller binære filer.
Vi kan velge mellom to typer lobber:
- CLOB - en tegnlobb som brukes til å lagre tekster
- BLOB - en binær lob som kan brukes til å lagre binære data
Vi kan bruke JPA @Lob kommentar for å kartlegge store felt til store database-objekttyper.
Når vi bruker @Lob ta opp på en String type-attributt, sier JPA-spesifikasjonen at utholdenhetsleverandøren skal bruke et stort tegn-type-objekt for å lagre verdien av attributtet. Følgelig kan PostgreSQL oversette en tegnloppe til en TEKST-type.
La oss anta at vi har en enkel Eksamen enhetsobjekt, med en beskrivelse felt, som kan ha en vilkårlig lengde:
@Entity public class Exam {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat Lang id; @Lob private strengbeskrivelse; }
Bruker @Lob kommentar i beskrivelsesfeltet, vi instruerer dvalemodus om å administrere dette feltet ved hjelp av PostgreSQL TEXT-typen.
4. @Kolonne
Et annet alternativ for å administrere TEXT-typen er å bruke @Kolonne kommentar, sammen med columnDefinition eiendom.
La oss bruke det samme Eksamen enhetsobjekt igjen, men denne gangen legger vi til et TEKST-felt, som kan ha en vilkårlig lengde:
@Entity public class Exam {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat Lang id; @Lob private strengbeskrivelse; @Column (columnDefinition = "TEKST") privat strengtekst; }
I dette eksemplet bruker vi merknaden @Column (columnDefinition = ”TEKST”). Bruker columnDefinition attributt lar oss spesifisere SQL-fragmentet som skal brukes når vi konstruerer datakolonnen for denne typen.
5. Å bringe det hele sammen
I denne delen vil vi skrive en enkel enhetstest for å bekrefte at løsningen fungerer:
@Test offentlig ugyldig gittExam_whenSaveExam_thenReturnExpectedExam () {Eksamen eksamen = ny eksamen (); exam.setDescription ("Dette er en beskrivelse. Noen ganger kan beskrivelsen være veldig veldig lang!"); exam.setText ("Dette er en tekst. Noen ganger kan teksten være veldig veldig lang!"); eksamen = examRepository.save (eksamen); assertEquals (examRepository.find (exam.getId ()), eksamen); }
I dette eksemplet begynner vi med å lage en ny Eksamen innvende og vedvare den til databasen vår. Vi henter deretter Eksamen objekt fra databasen og sammenlign resultatet med den opprinnelige eksamenen vi opprettet.
For å demonstrere poenget, hvis vi raskt endrer beskrivelsesfeltet på vårt Eksamen enhet:
@Column (lengde = 20) privat strengbeskrivelse;
Når vi kjører testen vår igjen, ser vi en feil:
FEIL o.h.e.jdbc.spi.SqlExceptionHelper - Verdien er for lang for kolonnen "TEKST VARCHAR (20)"
6. Konklusjon
I denne opplæringen dekket vi to tilnærminger for bruk av JPA-merknader med PostgreSQL TEXT-typen.
Vi begynte med å forklare hva TEKST-typen brukes til, og så så hvordan vi kan bruke JPA-merknadene @Lob og @Kolonne å redde String objekter som bruker TEXT-typen definert av PostgreSQL.
Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.