Ú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.