Útmutató a hibernált típusok könyvtárához

1. Áttekintés

Ebben az oktatóanyagban megnézzük a hibernált típusokat. Ez a könyvtár néhány olyan típust kínál számunkra, amelyek nem a natívak a Hibernate ORM magjában.

2. Függőségek

A hibernált típusok engedélyezéséhez csak hozzá kell adnunk a megfelelőt hibernált típusúak függőség:

 com.vladmihalcea hibernate-types-52 2.9.7 

Ez a hibernált verziókkal működik 5.4, 5.3, és 5.2.

Abban az esetben, ha a Hibernate verziója régebbi, a artefactId a fenti érték más lesz. Verziókhoz 5.1 és 5.0, tudjuk használni hibernate-types-51. Hasonlóképpen, verzió 4.3 igényel hibernate-types-43, és változatai 4.2, és a 4.1 hibernate-types-4.

Az oktatóanyag példái adatbázist igényelnek. A Docker használatával biztosítottunk egy adatbázis-tárolót. Ezért szükségünk lesz a Docker működő példányára.

Tehát az adatbázisunk futtatásához és létrehozásához csak végrehajtanunk kell:

$ ./create-database.sh

3. Támogatott adatbázisok

Használhatjuk típusainkat az Oracle, az SQL Server, a PostgreSQL és a MySQL adatbázisokkal. Ezért a Java-típusok hozzárendelése az adatbázis oszloptípusokhoz az általunk használt adatbázistól függően változik. Esetünkben a MySQL-t fogjuk használni, és feltérképezzük a JsonBinaryType JSON oszloptípusra.

A támogatott leképezésekről szóló dokumentáció megtalálható a Hibernate Types tárolóban.

4. Adatmodell

Az oktatóanyag adatmodellje lehetővé teszi számunkra, hogy információkat tároljunk az albumokról és a dalokról. Egy album borítót és egy vagy több dalt tartalmaz. Egy dalnak előadója és hossza van. A borítónak két kép URL-je és egy UPC-kódja van. Végül egy művésznek van neve, országa és zenei műfaja.

A múltban táblázatokat hoztunk létre, amelyek a modellünk összes adatait ábrázolják. De most, hogy rendelkezésünkre állnak a típusok, nagyon egyszerűen az adatok egy részét JSON néven tárolhatjuk.

Ehhez az oktatóanyaghoz csak táblázatokat hozunk létre az albumokhoz és a dalokhoz:

public class Album kiterjeszti a BaseEntity {@Type (type = "json") @Column (columnDefinition = "json") privát CoverArt coverArt; @OneToMany (fetch = FetchType.EAGER) privát Dalok listája; // az osztály többi tagja}
public class Song kiterjeszti a BaseEntity {private Long length = 0L; @Type (type = "json") @Column (columnDefinition = "json") privát művész; // az osztály többi tagja}

Használni a JsonStringType a borítót és a művészeket JSON oszlopként képviseljük ezekben a táblázatokban:

public class Artist megvalósítja a Serializable {private String name; privát String ország; privát vonós műfaj; // az osztály többi tagja}
public class A CoverArt megvalósítja a Serializable {private String frontCoverArtUrl; privát String backCoverArtUrl; privát String upcCode; // az osztály többi tagja}

Fontos megjegyezni, hogy a Művész és CoverArt osztályok POJO-k és nem entitások. Továbbá tagjai az adatbázis-entitásosztályainknak, amelyeket a @Type (type = “json”) annotáció.

4.1. JSON típusok tárolása

Meghatároztuk album- és dalmodelljeinket, hogy tartalmazzák azokat a tagokat, akiket az adatbázis JSON néven tárol. Ennek oka a biztosítottak használata json típus. Annak érdekében, hogy ez a típus elérhető legyen számunkra, meg kell határoznunk egy típusdefinícióval:

@TypeDefs ({@TypeDef (név = "json", typeClass = JsonStringType.class), @TypeDef (név = "jsonb", typeClass = JsonBinaryType.class)}) nyilvános osztály BaseEntity {// osztály tagjai}

A @Típus mert JsonStringType és JsonBinaryType teszi a típusokat json és jsonb elérhető.

A legújabb MySQL verziók oszloptípusként támogatják a JSON-t. Következésképpen, A JDBC feldolgozza az oszlopból olvasott JSON-okat vagy az oszlopokba mentett objektumokat, a fenti típusok egyikével a-ként Húr. Ez azt jelenti, hogy az oszlop helyes leképezéséhez használnunk kell JsonStringType típusmeghatározásunkban.

4.2. Hibernálás

Végül a típusaink automatikusan lefordulnak SQL-be ​​a JDBC és a Hibernate használatával. Tehát most létrehozhatunk néhány dalobjektumot, albumobjektumot, és megtarthatjuk őket az adatbázisban. Ezt követően a Hibernate a következő SQL utasításokat generálja:

illessze be a dalba (név, előadó, hossz, azonosító) értékeket ('Egy boldog dal', '{"név": "Szupersztár", "ország": "Anglia", "műfaj": "Pop"}', 240, 3); illessze be a dalba (név, előadó, hossz, azonosító) értékeket ('A Sad Song', '{"name": "Superstar", "country": "England", "genre": "Pop"}', 120 4); illessze be a dal (név, előadó, hossz, azonosító) értékeket ('Új dal', '{"név": "Új jövevény", "ország": "Jamaica", "műfaj": "Reggae"}, 300, 6) illessze be az albumba (név, borító_azonosító, azonosító) értékeket ('Album 0', '{"frontCoverArtUrl": "// fakeurl-0", "backCoverArtUrl": "// fakeurl-1", "upcCode": " b2b9b193-ee04-4cdc-be8f-3a276769ab5b "} ', 7) 

Ahogy az várható volt, a mi json típusú Java objektumokat a Hibernate fordítja le és formázott JSON formátumban tárolja az adatbázisunkban.

5. Általános típusok tárolása

A JSON alapú oszlopok támogatása mellett a könyvtár néhány általános típust is felvesz: ÉvHónap, Év, és Hónap tól java.time csomag.

Most feltérképezhetjük ezeket a típusokat, amelyeket a Hibernate vagy a JPA nem támogat natív módon. Ezenkívül képesek vagyunk tárolni őket Egész szám, Húr, vagy Dátum oszlop.

Tegyük fel például, hogy hozzá akarjuk adni egy dal rögzített dátumát a dátumhoz dal modell és tárolja mint Egész szám az adatbázisunkban. Használhatjuk a YearMonthIntegerType miénkben Dal entitásosztály meghatározása:

@TypeDef (typeClass = YearMonthIntegerType.class, defaultForType = YearMonth.class) public class Song kiterjeszti a BaseEntity {@Column (név = "felvett_on", oszlopDefinition = "mediumint") privát ÉvHónap felvettOn = Évhónap most (); // az osztály többi tagja} 

A mi onOn tulajdonság értéke lefordítva typeClass biztosítottuk. Ennek eredményeként egy előre definiált konverter megőrzi az adatbázisunkban szereplő értéket Egész szám.

6. Egyéb segédprogramok

A Hibernate Types néhány segítő osztályt tartalmaz, amelyek tovább javítják a fejlesztői élményt a Hibernate használatakor.

A CamelCaseToSnakeCaseNamingStrategy a Java osztályaink teve-tulajdonságú tulajdonságait térképezi fel az adatbázisunk kígyóházas oszlopaihoz.

A ClassImportIntegrator egyszerű Java DTO osztálynév értékeket tesz lehetővé a JPA konstruktor paraméterekben.

Vannak még a ListResultTransformer és a MapResultTransformer osztályok, amelyek a JPA által használt eredményobjektumok tisztább megvalósítását biztosítják. Emellett támogatják a lambdák használatát és visszafelé kompatibilitást nyújtanak a régebbi JPA verziókkal.

7. Következtetés

Ebben az oktatóanyagban bemutattuk a Hibernate Types Java könyvtárat és az új típusokat, amelyeket a Hibernate és a JPA-hoz ad hozzá. Megnéztük a könyvtár által biztosított segédprogramokat és általános típusokat is.

A példák és a kódrészletek megvalósítása elérhető a GitHubon.