Vodič za biblioteku hibernacijskih vrsta

1. Pregled

U ovom uputstvu ćemo pogledati vrste hibernacije. Ova nam knjižnica pruža nekoliko vrsta koje nisu izvorne u jezgri Hibernate ORM.

2. Ovisnosti

Da bismo omogućili vrste hibernacije, samo ćemo dodati odgovarajuće vrste hibernacije ovisnost:

 com.vladmihalcea hibernate-types-52 2.9.7 

Ovo će raditi s verzijama hibernacije 5.4, 5.3, i 5.2.

U slučaju da je verzija Hibernate starija, artefaktId vrijednost iznad bit će drugačija. Za verzije 5.1 i 5.0, možemo koristiti hibernacija-tipovi-51. Slično tome, verzija 4.3 zahtijeva hibernacija-vrste-43, i verzije 4.2, i 4.1 zahtijevaju hibernacija-vrste-4.

Primjeri u ovom vodiču zahtijevaju bazu podataka. Pomoću Dockera osigurali smo spremnik baze podataka. Stoga će nam trebati radna kopija Dockera.

Dakle, za pokretanje i stvaranje naše baze podataka potrebno je samo izvršiti:

$ ./create-database.sh

3. Podržane baze podataka

Naše vrste možemo koristiti s bazama podataka Oracle, SQL Server, PostgreSQL i MySQL. Stoga će mapiranje tipova u Javi na tipove stupaca baze podataka varirati ovisno o bazi podataka koju koristimo. U našem ćemo slučaju koristiti MySQL i mapirati JsonBinaryType na tip stupca JSON.

Dokumentacija o podržanim preslikavanjima može se naći na spremištu Hibernate Types.

4. Model podataka

Podatkovni model ovog vodiča omogućit će nam pohranu podataka o albumima i pjesmama. Album sadrži naslovnicu i jednu ili više pjesama. Pjesma ima izvođača i dužinu. Naslovnica ima dva URL-a slike i UPC kôd. Napokon, umjetnik ima ime, zemlju i glazbeni žanr.

U prošlosti smo stvarali tablice koje će predstavljati sve podatke u našem modelu. Ali sada, kad imamo dostupne vrste, neke podatke možemo vrlo jednostavno pohraniti kao JSON.

Za ovaj vodič izradit ćemo samo tablice za albume i pjesme:

album javne klase proširuje BaseEntity {@Type (type = "json") @Column (columnDefinition = "json") private CoverArt coverArt; @OneToMany (fetch = FetchType.EAGER) pjesme s privatnog popisa; // ostali članovi razreda}
pjesma javne klase proširuje BaseEntity {private Long length = 0L; @Type (type = "json") @Column (columnDefinition = "json") privatni izvođač; // ostali članovi razreda}

Koristiti JsonStringType predstavit ćemo naslovnicu i umjetnike kao JSON stupce u tim tablicama:

umjetnik javne klase implementira Serializable {private String name; privatna gudačka zemlja; privatni žanr žica; // ostali članovi razreda}
public class CoverArt implementira Serializable {private String frontCoverArtUrl; private String backCoverArtUrl; privatni niz upcCode; // ostali članovi razreda}

Važno je napomenuti da Umjetnik i CoverArt klase su POJO, a ne entiteti. Nadalje, oni su članovi naše klase entiteta baze podataka, definirane s @Type (type = “json”) bilješka.

4.1. Pohranjivanje JSON vrsta

Definirali smo modele albuma i pjesama kako bi sadržavali članove koje će baza podataka pohranjivati ​​kao JSON. To je zbog korištenja priloženog json tip. Da bi nam taj tip bio dostupan, moramo ga definirati pomoću definicije tipa:

@TypeDefs ({@TypeDef (name = "json", typeClass = JsonStringType.class), @TypeDef (name = "jsonb", typeClass = JsonBinaryType.class)}) javna klasa BaseEntity {// članovi klase}

The @Tip za JsonStringType i JsonBinaryType čini vrste json i jsonb dostupno.

Najnovije verzije MySQL podržavaju JSON kao vrstu stupca. Slijedom toga, JDBC obrađuje bilo koji JSON pročitani iz bilo kojeg objekta spremljenog u stupac s bilo kojim od ovih tipova kao Niz. To znači da za pravilno mapiranje stupca moramo koristiti JsonStringType u našoj definiciji tipa.

4.2. Hibernate

Na kraju, naši će se tipovi automatski prevesti u SQL pomoću JDBC i Hibernate. Dakle, sada možemo stvoriti nekoliko objekata pjesme, objekt albuma i zadržati ih u bazi podataka. Nakon toga Hibernate generira sljedeće SQL izjave:

umetnite u vrijednosti pjesme (ime, izvođač, dužina, id) ('Sretna pjesma', '{"ime": "Superstar", "country": "Engleska", "žanr": "Pop"}', 240, 3); umetnite u vrijednosti pjesme (ime, izvođač, dužina, id) ('A Sad Song', '{"name": "Superstar", "country": "England", "genre": "Pop"}', 120, 4); umetnite u vrijednosti pjesme (ime, izvođač, dužina, id) ('Nova pjesma', '{"ime": "Novopridošli", "država": "Jamajka", "žanr": "Reggae"}', 300, 6) umetanje u vrijednost albuma (ime, naslov_artice, id) ('Album 0', '{"frontCoverArtUrl": "// fakeurl-0", "backCoverArtUrl": "// fakeurl-1", "upcCode": " b2b9b193-ee04-4cdc-be8f-3a276769ab5b "} ', 7) 

Očekivano, naša json Objekti tipa Java svi su prevedeni Hibernate-om i pohranjeni u obliku JSON-a u našu bazu podataka.

5. Pohranjivanje generičkih vrsta

Osim podrške stupcima temeljenim na JSON-u, knjižnica također dodaje nekoliko generičkih vrsta: GodinaMjesec, Godina, i Mjesec od java.vrijeme paket.

Sada možemo mapirati ove vrste koje Hibernate ili JPA ne podržavaju izvorno. Također, sada ih imamo mogućnost pohraniti kao Cijeli broj, Niz, ili Datum stupac.

Na primjer, recimo da želimo dodati snimljeni datum pjesme u svoj pjesma model i pohranite ga kao Cijeli broj u našoj bazi podataka. Možemo koristiti YearMonthIntegerType u našem Pjesma definicija klase entiteta:

@TypeDef (typeClass = YearMonthIntegerType.class, defaultForType = YearMonth.class) Pjesma javne klase proširuje BaseEntity {@Column (name = "zapisani_on", columnDefinition = "mediumint") private YearMonth RecordOn = YearMonth.now (); // ostali članovi razreda} 

Naše snimljenoOn vrijednost nekretnine prevedena je u typeClass osigurali smo. Kao rezultat, unaprijed definirani pretvarač zadržat će vrijednost u našoj bazi podataka kao Cijeli broj.

6. Ostale korisne klase

Hibernate Types ima nekoliko klasa pomoćnika koji dodatno poboljšavaju doživljaj programera pri korištenju Hibernate.

The CamelCaseToSnakeCaseNamingStrategy preslikava svojstva u kamilama u našim tečajevima Java u stupce u našoj bazi podataka u obliku zmija.

The ClassImportIntegrator omogućuje jednostavne vrijednosti naziva Java DTO klase u parametrima JPA konstruktora.

Postoje i ListResultTransformer i MapResultTransformer klase koje pružaju čišće implementacije rezultatskih objekata koje koristi JPA. Osim toga, podržavaju upotrebu lambdas-a i pružaju povratnu kompatibilnost sa starijim verzijama JPA.

7. Zaključak

U ovom smo uputstvu predstavili Java knjižnicu Hibernate Types i nove tipove koje dodaje Hibernate i JPA. Također smo pogledali neke uslužne i generičke tipove koje nudi knjižnica.

Implementacija primjera i isječaka koda dostupni su na GitHubu.


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