Een gids voor de slaapstandtypenbibliotheek

1. Overzicht

In deze zelfstudie bekijken we Slaapstandtypen. Deze bibliotheek biedt ons een paar typen die niet native zijn in de Hibernate ORM.

2. Afhankelijkheden

Om slaapstandtypen in te schakelen, voegen we gewoon de juiste toe slaapstand-typen afhankelijkheid:

 com.vladmihalcea hibernate-types-52 2.9.7 

Dit werkt met Hibernate-versies 5.4, 5.3, en 5.2.

In het geval dat de versie van Hibernate ouder is, kan het artefact-id bovenstaande waarde zal anders zijn. Voor versies 5.1 en 5.0, we kunnen gebruiken slaapstand-types-51. Evenzo version 4.3 vereist winterslaap-types-43, en versies 4.2, en 4.1 vereisen slaapstand-types-4.

Voor de voorbeelden in deze tutorial is een database vereist. Met Docker hebben we een databasecontainer geleverd. Daarom hebben we een werkende kopie van Docker nodig.

Dus om onze database uit te voeren en te maken, hoeven we alleen het volgende uit te voeren:

$ ./create-database.sh

3. Ondersteunde databases

We kunnen onze typen gebruiken met Oracle-, SQL Server-, PostgreSQL- en MySQL-databases. Daarom zal de toewijzing van typen in Java aan databasekolomtypen variëren, afhankelijk van de database die we gebruiken. In ons geval zullen we MySQL gebruiken en het JsonBinaryType naar een JSON-kolomtype.

Documentatie over de ondersteunde toewijzingen is te vinden in de Hibernate Types-repository.

4. Gegevensmodel

Met het gegevensmodel voor deze tutorial kunnen we informatie over albums en liedjes opslaan. Een album bevat albumhoezen en een of meer nummers. Een nummer heeft een artiest en lengte. De albumhoes heeft twee afbeeldings-URL's en een UPC-code. Ten slotte heeft een artiest een naam, een land en een muziekgenre.

In het verleden hadden we tabellen gemaakt om alle gegevens in ons model weer te geven. Maar nu we typen tot onze beschikking hebben, kunnen we in plaats daarvan een deel van de gegevens heel gemakkelijk als JSON opslaan.

Voor deze tutorial maken we alleen tabellen voor de albums en de nummers:

public class Album breidt BaseEntity uit {@Type (type = "json") @Column (columnDefinition = "json") privé CoverArt coverArt; @OneToMany (fetch = FetchType.EAGER) privélijstnummers; // andere klasleden}
public class Song verlengt BaseEntity {private Long length = 0L; @Type (type = "json") @Column (columnDefinition = "json") privé artiest artiest; // andere klasleden}

De ... gebruiken JsonStringType we vertegenwoordigen de hoesafbeeldingen en artiesten als JSON-kolommen in die tabellen:

public class Artist implementeert Serializable {private String name; privé String land; privé String-genre; // andere klasleden}
public class CoverArt implementeert Serializable {private String frontCoverArtUrl; privé String backCoverArtUrl; private String upcCode; // andere klasleden}

Het is belangrijk op te merken dat de Artiest en Omslagdesign klassen zijn POJO's en geen entiteiten. Bovendien zijn ze leden van onze database-entiteitsklassen, gedefinieerd met de @Type (type = “json”) annotatie.

4.1. JSON-typen opslaan

We hebben onze album- en songmodellen zo gedefinieerd dat ze leden bevatten die de database als JSON zal opslaan. Dit komt door het gebruik van de meegeleverde json type. Om dat type beschikbaar te hebben dat we kunnen gebruiken, moeten we het definiëren met behulp van een typedefinitie:

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

De @Type voor JsonStringType en JsonBinaryType maakt de typen json en jsonb beschikbaar.

De nieuwste MySQL-versies ondersteunen JSON als kolomtype. Bijgevolg, JDBC verwerkt elke JSON die is gelezen van of elk object dat is opgeslagen in een kolom met een van deze typen als een Draad. Dit betekent dat we moeten gebruiken om correct naar de kolom toe te wijzen JsonStringType in onze typedefinitie.

4.2. Slaapstand

Uiteindelijk vertalen onze typen automatisch naar SQL met behulp van JDBC en Hibernate. Nu kunnen we dus een paar songobjecten en een albumobject maken en deze in de database bewaren. Vervolgens genereert Hibernate de volgende SQL-instructies:

invoegen in nummer (naam, artiest, lengte, id) waarden ('A Happy Song', '{"name": "Superstar", "country": "England", "genre": "Pop"}', 240, 3); invoegen in nummer (naam, artiest, lengte, id) waarden ('A Sad Song', '{"name": "Superstar", "country": "England", "genre": "Pop"}', 120, 4); invoegen in nummer (naam, artiest, lengte, id) waarden ('A New Song', '{"name": "Newcomer", "country": "Jamaica", "genre": "Reggae"}', 300, 6) waarden invoegen in album (name, cover_art, id) ('Album 0', '{"frontCoverArtUrl": "// fakeurl-0", "backCoverArtUrl": "// fakeurl-1", "upcCode": " b2b9b193-ee04-4cdc-be8f-3a276769ab5b "} ', 7) 

Zoals verwacht, onze json type Java-objecten worden allemaal vertaald door Hibernate en opgeslagen als goed gevormde JSON in onze database.

5. Generieke typen opslaan

Naast het ondersteunen van op JSON gebaseerde kolommen, voegt de bibliotheek ook een paar generieke typen toe: Jaar maand, Jaar, en Maand van de java.time pakket.

Nu kunnen we deze typen in kaart brengen die niet standaard worden ondersteund door Hibernate of JPA. We hebben nu ook de mogelijkheid om ze op te slaan als een Geheel getal, Draad, of Datum kolom.

Laten we bijvoorbeeld zeggen dat we de opnamedatum van een nummer aan ons willen toevoegen lied model en bewaar het als een Geheel getal in onze database. We kunnen de JaarMaandGeheel getalType in onze Song entiteitsklasse definitie:

@TypeDef (typeClass = YearMonthIntegerType.class, defaultForType = YearMonth.class) public class Song breidt BaseEntity uit {@Column (name = "opgenomen_on", columnDefinition = "mediumint") privé YearMonth opgenomenOn = YearMonth.now (); // andere klasleden} 

Onze opgenomen op eigenschapswaarde wordt vertaald naar de typeClass wij hebben voorzien. Als resultaat, een vooraf gedefinieerde converter zal de waarde in onze database behouden als een Geheel getal.

6. Andere gebruiksklassen

Hibernate-typen heeft een paar helper-klassen die de ontwikkelaarservaring verder verbeteren bij het gebruik van Hibernate.

De CamelCaseToSnakeCaseNamingStrategy wijst kameel-omhulde eigendommen in onze Java-klassen toe aan kolommen met slangenomhulling in onze database.

De ClassImportIntegrator staat eenvoudige waarden voor Java DTO-klassenaam toe in JPA-constructorparameters.

Er zijn ook de ListResultTransformer en de MapResultTransformer klassen die schonere implementaties bieden van de resultaatobjecten die door JPA worden gebruikt. Bovendien ondersteunen ze het gebruik van lambda's en bieden ze achterwaartse compatibiliteit met oudere JPA-versies.

7. Conclusie

In deze tutorial hebben we de Hibernate Types Java-bibliotheek geïntroduceerd en de nieuwe typen die deze toevoegt aan Hibernate en JPA. We hebben ook gekeken naar enkele hulpprogramma's en generieke typen die door de bibliotheek worden aangeboden.

De implementatie van de voorbeelden en codefragmenten is beschikbaar op GitHub.