En guide til dvale-typebiblioteket

1. Oversigt

I denne tutorial tager vi et kig på dvale-typer. Dette bibliotek giver os et par typer, der ikke er hjemmehørende i kernen Hibernate ORM.

2. Afhængigheder

For at aktivere dvaletyper tilføjer vi bare det relevante dvale-typer afhængighed:

 com.vladmihalcea dvale-typer-52 2.9.7 

Dette fungerer med dvaletilstandsversioner 5.4, 5.3, og 5.2.

I tilfælde af at versionen af ​​dvale er ældre, er artefaktId værdien ovenfor vil være forskellig. Til versioner 5.1 og 5.0, vi kan bruge dvale-typer-51. Tilsvarende version 4.3 kræver dvale-typer-43, og versioner 4.2, og 4.1 kræver dvale-typer-4.

Eksemplerne i denne vejledning kræver en database. Ved hjælp af Docker har vi leveret en databasebeholder. Derfor har vi brug for en arbejdskopi af Docker.

Så for at køre og oprette vores database behøver vi kun at udføre:

$ ./create-database.sh

3. Understøttede databaser

Vi kan bruge vores typer med Oracle-, SQL Server-, PostgreSQL- og MySQL-databaser. Derfor vil kortlægningen af ​​typer i Java til databasekolonnetyper variere afhængigt af den database, vi bruger. I vores tilfælde bruger vi MySQL og kortlægger JsonBinaryType til en JSON-kolonnetype.

Dokumentation om de understøttede tilknytninger kan findes i arkivet Hibernate Types.

4. Datamodel

Datamodellen til denne tutorial giver os mulighed for at gemme oplysninger om album og sange. Et album har coverkunst og en eller flere sange. En sang har en kunstner og længde. Omslaget har to billed-URL'er og en UPC-kode. Endelig har en kunstner et navn, et land og en musikalsk genre.

Tidligere havde vi oprettet tabeller til at repræsentere alle data i vores model. Men nu hvor vi har typer til rådighed for os, kan vi meget let gemme nogle af dataene som JSON i stedet.

Til denne vejledning opretter vi kun tabeller til albummerne og sangene:

public class Album udvider BaseEntity {@Type (type = "json") @Column (columnDefinition = "json") privat CoverArt coverArt; @OneToMany (fetch = FetchType.EAGER) private Liste over sange; // andre klassemedlemmer}
offentlig klasse sang udvider BaseEntity {privat Lang længde = 0L; @Type (type = "json") @Column (columnDefinition = "json") privat kunstner kunstner; // andre klassemedlemmer}

Bruger JsonStringType Vi repræsenterer omslagskunst og kunstnere som JSON-kolonner i disse tabeller:

offentlig klasse Kunstner implementerer Serialiserbar {privat strengnavn; privat strengland; privat strenggenre; // andre klassemedlemmer}
offentlig klasse CoverArt implementerer Serialiserbar {privat String frontCoverArtUrl; privat streng tilbageCoverArtUrl; private String upcCode; // andre klassemedlemmer}

Det er vigtigt at bemærke, at Kunstner og CoverArt klasser er POJO'er og ikke enheder. Desuden er de medlemmer af vores databaseenhedsklasser, defineret med @Type (type = “json”) kommentar.

4.1. Lagring af JSON-typer

Vi definerede vores album- og sangmodeller til at indeholde medlemmer, databasen gemmer som JSON. Dette skyldes brug af den medfølgende json type. For at have den type tilgængelig for os at bruge, skal vi definere den ved hjælp af en typedefinition:

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

Det @Type til JsonStringType og JsonBinaryType gør typerne json og jsonb ledig.

De nyeste MySQL-versioner understøtter JSON som en kolonnetype. Følgelig, JDBC behandler enhver JSON-læst fra eller ethvert objekt, der er gemt i en kolonne med en af ​​disse typer som en Snor. Dette betyder, at vi skal bruge til at kortlægge til kolonnen korrekt JsonStringType i vores typedefinition.

4.2. Dvale

I sidste ende vil vores typer automatisk oversættes til SQL ved hjælp af JDBC og Dvaletilstand. Så nu kan vi oprette et par sangobjekter, et albumobjekt og fastholde dem i databasen. Derefter genererer Hibernate følgende SQL-sætninger:

indsæt værdier for sang (navn, kunstner, længde, id) ('A Happy Song', '{"name": "Superstar", "country": "England", "genre": "Pop"}', 240, 3); indsæt værdier for sang (navn, kunstner, længde, id) ('En trist sang', '{"name": "Superstar", "country": "England", "genre": "Pop"}', 120, 4); indsæt værdier i sang (navn, kunstner, længde, id) ('A New Song', '{"name": "Newcomer", "country": "Jamaica", "genre": "Reggae"}', 300, 6) indsæt i albumværdier (navn, cover_art, id) ('Album 0', '{"frontCoverArtUrl": "// fakeurl-0", "backCoverArtUrl": "// fakeurl-1", "upcCode": " b2b9b193-ee04-4cdc-be8f-3a276769ab5b "} ', 7) 

Som forventet, vores json type Java-objekter oversættes alle af dvale og gemmes som velformede JSON i vores database.

5. Lagring af generiske typer

Udover at støtte JSON-baserede kolonner tilføjer biblioteket også et par generiske typer: ÅrMåned, År, og Måned fra java.tid pakke.

Nu kan vi kortlægge disse typer, der ikke understøttes af Hibernate eller JPA. Vi har også muligheden for at gemme dem som en Heltal, Snor, eller Dato kolonne.

Lad os for eksempel sige, at vi vil føje den indspillede dato for en sang til vores sang model og opbevar den som en Heltal i vores database. Vi kan bruge YearMonthIntegerType i vores Sang definition af enhedsklasse:

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

Vores registreretTil ejendomsværdi oversættes til typeKlasse vi leverede. Som resultat, en foruddefineret konverter vil fastholde værdien i vores database som en Heltal.

6. Andre værktøjsklasser

Dvale Typer har et par hjælperklasser, der yderligere forbedrer udvikleroplevelsen, når du bruger Dvaletilstand.

Det CamelCaseToSnakeCaseNamingStrategy kortlægger egenskaber med kamel i vores Java-klasser til kolonner med slange i vores database.

Det ClassImportIntegrator tillader enkle Java DTO-klassens navnværdier i JPA-konstruktorparametre.

Der er også ListResultTransformer og MapResultTransformer klasser, der giver renere implementeringer af de resultatobjekter, der bruges af JPA. Derudover understøtter de brugen af ​​lambdas og giver bagudkompatibilitet med ældre JPA-versioner.

7. Konklusion

I denne vejledning introducerede vi Java-biblioteket Hibernate Types og de nye typer, det tilføjer til Hibernate og JPA. Vi kiggede også på nogle af de hjælpeprogrammer og generiske typer, biblioteket leverede.

Implementeringen af ​​eksemplerne og kodestykker er tilgængelig på GitHub.


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