En guide til dvalemodus-biblioteket

1. Oversikt

I denne veiledningen tar vi en titt på dvalemodus. Dette biblioteket gir oss noen få typer som ikke er hjemmehørende i kjernen Hibernate ORM.

2. Avhengigheter

For å aktivere dvaletypetyper legger vi bare til det aktuelle dvale-typer avhengighet:

 com.vladmihalcea dvale-typer-52 2.9.7 

Dette fungerer med dvalemodusversjoner 5.4, 5.3, og 5.2.

I tilfelle versjonen av dvalemodus er eldre, er artefaktId verdien over vil være annerledes. For versjoner 5.1 og 5.0, Vi kan bruke dvale-typer-51. Tilsvarende versjon 4.3 krever dvale-typer-43, og versjoner 4.2, og 4.1 krever dvale-typer-4.

Eksemplene i denne opplæringen krever en database. Ved hjelp av Docker har vi levert en databasebeholder. Derfor trenger vi en arbeidskopi av Docker.

Så for å kjøre og opprette databasen vår trenger vi bare å utføre:

$ ./create-database.sh

3. Støttede databaser

Vi kan bruke våre typer med Oracle-, SQL Server-, PostgreSQL- og MySQL-databaser. Derfor vil kartleggingen av typer i Java til databasekolonnetyper variere avhengig av databasen vi bruker. I vårt tilfelle vil vi bruke MySQL og kartlegge JsonBinaryType til en JSON-kolonnetype.

Dokumentasjon om støttede kartlegginger finner du i arkivet Dvalemodus.

4. Datamodell

Datamodellen for denne veiledningen lar oss lagre informasjon om album og sanger. Et album har coverkunst og en eller flere sanger. En sang har en artist og lengde. Omslaget har to URL-er til bilder og en UPC-kode. Endelig har en artist et navn, et land og en musikalsk sjanger.

Tidligere hadde vi laget tabeller for å representere alle dataene i modellen vår. Men nå som vi har typer tilgjengelig for oss, kan vi veldig enkelt lagre noen av dataene som JSON i stedet.

For denne opplæringen oppretter vi bare tabeller for albumene og sangene:

offentlig klasse Album utvider BaseEntity {@Type (type = "json") @Column (columnDefinition = "json") privat CoverArt coverArt; @OneToMany (fetch = FetchType.EAGER) private Liste sanger; // andre klassemedlemmer}
offentlig klasse Song utvider BaseEntity {privat Lang lengde = 0L; @Type (type = "json") @Column (columnDefinition = "json") privat kunstner kunstner; // andre klassemedlemmer}

Bruker JsonStringType Vi representerer omslagsbilder og kunstnere som JSON-kolonner i disse tabellene:

public class Artist implementerer Serializable {private String name; privat strengland; privat String sjanger; // andre klassemedlemmer}
offentlig klasse CoverArt implementerer Serializable {private String frontCoverArtUrl; privat streng tilbakeCoverArtUrl; privat streng upcCode; // andre klassemedlemmer}

Det er viktig å merke seg at kunstner og CoverArt klasser er POJOer og ikke enheter. Videre er de medlemmer av klassen vår i databasenhet, definert med @Type (type = “json”) kommentar.

4.1. Lagring av JSON-typer

Vi definerte album- og sangmodellene våre slik at de inneholder medlemmer databasen vil lagre som JSON. Dette skyldes bruk av den medfølgende json type. For å ha den typen tilgjengelig for oss å bruke, må vi definere den ved hjelp av en typedefinisjon:

@TypeDefs ({@TypeDef (name = "json", typeClass = JsonStringType.class), @TypeDef (name = "jsonb", typeClass = JsonBinaryType.class)}) offentlig klasse BaseEntity {// klassemedlemmer}

De @Type til JsonStringType og JsonBinaryType lager typene json og jsonb tilgjengelig.

De siste MySQL-versjonene støtter JSON som en kolonnetype. Følgelig JDBC behandler alle JSON-lesninger fra eller ethvert objekt som er lagret i en kolonne med en av disse typene som en String. Dette betyr at vi må bruke for å kartlegge kolonnen riktig JsonStringType i vår typedefinisjon.

4.2. Dvalemodus

Til slutt vil typene våre automatisk overføres til SQL ved hjelp av JDBC og Hibernate. Så nå kan vi lage noen få sangobjekter, et albumobjekt og vedvare dem til databasen. Deretter genererer dvalemodus følgende SQL-setninger:

sett inn verdier for sang (navn, artist, lengde, id) ('A Happy Song', '{"name": "Superstar", "country": "England", "genre": "Pop"}', 240, 3); sett inn i verdiene for sang (navn, artist, lengde, id) ('A Sad Song', '{"name": "Superstar", "country": "England", "genre": "Pop"}', 120, 4); sett inn verdier for sang (navn, artist, lengde, id) ('A New Song', '{"name": "Newcomer", "country": "Jamaica", "genre": "Reggae"}', 300, 6) sett inn i albumverdiene (navn, cover_art, id) ('Album 0', '{"frontCoverArtUrl": "// fakeurl-0", "backCoverArtUrl": "// fakeurl-1", "upcCode": " b2b9b193-ee04-4cdc-be8f-3a276769ab5b "} ', 7) 

Som forventet, vår json type Java-objekter blir oversatt av dvalemodus og lagret som velformet JSON i vår database.

5. Lagring av generiske typer

Foruten å støtte JSON-baserte kolonner, legger biblioteket også til noen generiske typer: ÅrMåned, År, og Måned fra java.time pakke.

Nå kan vi kartlegge disse typene som ikke støttes av Hibernate eller JPA. Vi har nå muligheten til å lagre dem som en Heltall, Streng, eller Dato kolonne.

La oss for eksempel si at vi vil legge til den innspilte datoen for en sang til vår sang modell og lagre den som en Heltall i databasen vår. Vi kan bruke YearMonthIntegerType i vår Sang definisjon av enhetsklasse:

@TypeDef (typeClass = YearMonthIntegerType.class, defaultForType = YearMonth.class) offentlig klasse Song utvider BaseEntity {@Column (name = "recording_on", columnDefinition = "mediumint") private YearMonth recordingOn = YearMonth.now (); // andre klassemedlemmer} 

Våre registrert På eiendomsverdien blir oversatt til typeClass vi ga. Som et resultat, en forhåndsdefinert omformer vil vedvare verdien i databasen vår som en Heltall.

6. Andre verktøysklasser

Dvalemodus har noen hjelpeklasser som ytterligere forbedrer utvikleropplevelsen når du bruker dvalemodus.

De CamelCaseToSnakeCaseNamingStrategy kartlegger kamelbaserte egenskaper i Java-klasser til slangedekkede kolonner i vår database.

De ClassImportIntegrator tillater enkle Java DTO-klassenavnverdier i JPA-konstruktorparametere.

Det er også ListResultTransformer og MapResultTransformer klasser som gir renere implementeringer av resultatobjektene som brukes av JPA. I tillegg støtter de bruken av lambdas og gir bakoverkompatibilitet med eldre JPA-versjoner.

7. Konklusjon

I denne opplæringen introduserte vi Java-biblioteket Hibernate Types og de nye typene det legger til Hibernate og JPA. Vi så også på noen av verktøyene og generiske typene som tilbys av biblioteket.

Implementeringen av eksemplene og kodebiter er tilgjengelig på GitHub.


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