Sprievodca knižnicou typov dlhodobého spánku

1. Prehľad

V tomto výučbe sa pozrieme na typy dlhodobého spánku. Táto knižnica nám poskytuje niekoľko typov, ktoré nie sú natívne v jadre Hibernate ORM.

2. Závislosti

Ak chcete povoliť typy dlhodobého spánku, pridáme iba príslušné položky typy hibernácie závislosť:

 com.vladmihalcea hibernácia-typy-52 2.9.7 

Toto bude fungovať s verziami Hibernate 5.4, 5.3, a 5.2.

V prípade, že je verzia režimu dlhodobého spánku staršia, artifactId vyššie uvedená hodnota bude iná. Pre verzie 5.1 a 5.0, môžeme použiť hibernácia-typy-51. Podobne verzia 4.3 vyžaduje hibernácia-typy-43, a verzie 4.2, a 4.1 vyžadujú hibernácia-typy-4.

Príklady v tomto výučbe vyžadujú databázu. Pomocou Dockeru sme poskytli databázový kontajner. Preto budeme potrebovať pracovnú kópiu Dockeru.

Na spustenie a vytvorenie našej databázy teda stačí vykonať iba:

$ ./create-database.sh

3. Podporované databázy

Naše typy môžeme používať s databázami Oracle, SQL Server, PostgreSQL a MySQL. Preto sa mapovanie typov v Jave na typy stĺpcov databázy bude líšiť v závislosti od databázy, ktorú používame. V našom prípade použijeme MySQL a namapujeme JsonBinaryType na typ stĺpca JSON.

Dokumentáciu o podporovaných mapovaniach nájdete v úložisku typov dlhodobého spánku.

4. Dátový model

Dátový model tohto tutoriálu nám umožní ukladať informácie o albumoch a skladbách. Album obsahuje obal a jednu alebo viac skladieb. Skladba má umelca a dĺžku. Prebal má dve adresy URL obrázkov a kód UPC. Nakoniec má umelec meno, krajinu a hudobný žáner.

V minulosti by sme vytvorili tabuľky, ktoré reprezentujú všetky údaje v našom modeli. Teraz však máme typy, ktoré máme k dispozícii, a preto môžeme veľmi ľahko namiesto nich uložiť niektoré dáta ako JSON.

V tomto výučbe vytvoríme iba tabuľky pre albumy a skladby:

public class Album extends BaseEntity {@Type (type = "json") @Column (columnDefinition = "json") private CoverArt coverArt; @OneToMany (fetch = FetchType.EAGER) súkromné ​​zoznamy skladieb; // ostatní členovia triedy}
public class Song rozširuje BaseEntity {private Long length = 0L; @Type (type = "json") @Column (columnDefinition = "json") súkromný umelec; // ostatní členovia triedy}

Pomocou JsonStringType v týchto tabuľkách predstavíme obal a umelcov ako stĺpce JSON:

public class Interpret implementuje Serializable {private String name; súkromná reťazcová krajina; súkromný žáner String; // ostatní členovia triedy}
verejná trieda CoverArt implementuje Serializable {private String frontCoverArtUrl; private String backCoverArtUrl; privátny reťazec upcCode; // ostatní členovia triedy}

Je dôležité poznamenať, že Umelec a CoverArt triedy sú POJO a nie subjekty. Ďalej sú členmi našich tried databázových entít definovaných pomocou @Type (type = “json”) anotácia.

4.1. Ukladajú sa typy JSON

Naše modely albumov a skladieb sme definovali tak, aby obsahovali členov, ktorých bude databáza ukladať ako JSON. Je to spôsobené používaním poskytnutých json typu. Aby sme mali tento typ k dispozícii na použitie, musíme ho definovať pomocou definície typu:

@TypeDefs ({@TypeDef (name = "json", typeClass = JsonStringType.class), @TypeDef (name = "jsonb", typeClass = JsonBinaryType.class)}) verejná trieda BaseEntity {// členovia triedy}

The @ Typ pre JsonStringType a JsonBinaryType vyrába typy json a jsonb k dispozícii.

Najnovšie verzie MySQL podporujú JSON ako typ stĺpca. V dôsledku toho JDBC spracuje akýkoľvek súbor JSON načítaný z alebo akýkoľvek objekt uložený do stĺpca s ktorýmkoľvek z týchto typov ako String. To znamená, že na správne mapovanie do stĺpca musíme použiť JsonStringType v našej definícii typu.

4.2. Hibernácia

Naše typy sa nakoniec automaticky prevedú na SQL pomocou JDBC a Hibernate. Takže teraz môžeme vytvoriť niekoľko objektov skladieb, objekt albumu a uchovať ich v databáze. Následne program Hibernate vygeneruje nasledujúce príkazy SQL:

vložte do skladby (meno, interpret, dĺžka, id) hodnoty ('A Happy Song', '{"name": "Superstar", "country": "England", "žáner": "Pop"}', 240, 3); vložte do hodnoty piesne (meno, interpret, dĺžka, id) hodnoty ('A Sad Song', '{"name": "Superstar", "country": "England", "žáner": "Pop"}', 120, 4); vložte do hodnoty skladby (meno, interpret, dĺžka, id) hodnoty ('A New Song', '{"name": "Newcomer", "country": "Jamaica", "genre": "Reggae"}', 300, 6) vložte do albumu (name, cover_art, id) hodnoty ('Album 0', '{"frontCoverArtUrl": "// fakeurl-0", "backCoverArtUrl": "// fakeurl-1", "upcCode": " b2b9b193-ee04-4cdc-be8f-3a276769ab5b "} ', 7) 

Podľa očakávania naše json Všetky objekty typu Java sú prekladané režimom dlhodobého spánku a ukladané ako dobre sformátovaný formát JSON v našej databáze.

5. Ukladanie všeobecných typov

Okrem podpory stĺpcov založených na JSON, knižnica pridáva aj niekoľko všeobecných typov: RokMesiac, Rok, a Mesiac z java.time balíček.

Teraz môžeme mapovať tieto typy, ktoré program Hibernate alebo JPA natívne nepodporuje. Teraz ich máme tiež možnosť uložiť ako Celé číslo, Reťazec, alebo Dátum stĺpec.

Povedzme napríklad, že chceme k nášmu záznamu pridať dátum nahrávky pieseň model a uložiť ako Celé číslo v našej databáze. Môžeme použiť YearMonthIntegerType v našom Pieseň definícia triedy entity:

@TypeDef (typeClass = YearMonthIntegerType.class, defaultForType = YearMonth.class) verejná trieda Song rozširuje BaseEntity {@Column (name = "zaznamenané_on", columnDefinition = "mediumint") súkromné ​​YearMonth zaznamenanéO = YearMonth.now (); // ostatní členovia triedy} 

Náš zaznamenanéOn hodnota nehnuteľnosti sa preloží na typTrieda poskytli sme. Ako výsledok, preddefinovaný prevodník zachová hodnotu v našej databáze ako Celé číslo.

6. Ostatné triedy úžitkovej hodnoty

Hibernate Types má niekoľko pomocných tried, ktoré ďalej zlepšujú skúsenosti vývojárov pri používaní režimu Hibernate.

The CamelCaseToSnakeCaseNamingStrategy Mapuje vlastnosti ťavej bázy v našich triedach Java na stĺpce hadej bázy v našej databáze.

The ClassImportIntegrator umožňuje jednoduché hodnoty názvu triedy Java DTO v parametroch konštruktora JPA.

Existujú aj ListResultTransformer a MapResultTransformer triedy poskytujúce čistejšie implementácie výsledných objektov používaných JPA. Okrem toho podporujú použitie lambdas a poskytujú spätnú kompatibilitu so staršími verziami JPA.

7. Záver

V tomto tutoriáli sme predstavili knižnicu Java Hibernate Types a nové typy, ktoré pridáva do režimov Hibernate a JPA. Pozreli sme sa tiež na niektoré pomocné programy a generické typy poskytované knižnicou.

Implementácia príkladov a útržkov kódu je k dispozícii na serveri GitHub.


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