JPA 2.2 Podrška za Java 8 Vrste datuma / vremena

1. Pregled

Verzija JPA 2.2 službeno je uvela podršku za Javu 8 Datum i Vrijeme API. Prije toga ili smo se morali pouzdati u vlasničko rješenje ili smo morali koristiti API JPA Converter.

U ovom vodiču, pokazat ćemo kako mapirati razne Java 8 Datum i Vrijeme vrste. Posebno ćemo se usredotočiti na one koji uzimaju u obzir offset informacije.

2. Ovisnosti Mavena

Prije nego što započnemo, na put predavanja projekta moramo uključiti JPA 2.2 API. U projektu koji se temelji na Mavenu, njegovu ovisnost možemo jednostavno dodati našoj pom.xml datoteka:

 javax.postojanost javax.persistence-api 2.2 

Uz to, za pokretanje projekta potrebna nam je JPA implementacija i JDBC pokretački program baze podataka s kojom ćemo raditi. U ovom uputstvu koristit ćemo EclipseLink i bazu podataka PostgreSQL:

 org.eclipse.persistence eclipselink 2.7.4 runtime org.postgresql postgresql 42.2.5 runtime bundle 

Slobodno provjerite najnovije verzije JPA API-ja, EclipseLink i PostgreSQL JDBC upravljački program na Maven Central.

Naravno, možemo koristiti druge baze podataka ili JPA implementacije poput Hibernate.

3. Podrška za TimeZone

Možemo raditi sa bilo kojom bazom podataka, ali prvo bismo trebali provjeriti podršku za ove standardne SQL vrste, jer se JDBC 4.2 temelji na:

  • VREMENSKI KAMP (n) S VREMENSKIM ZONOM
  • VREMENSKI KAMP (n) BEZ VREMENSKE ZONE
  • VRIJEME (n) S VREMENSKIM ZONOM
  • VRIJEME (n) BEZ VREMENSKE ZONE

Ovdje, n je frakcijska preciznost sekundi i iznosi između 0 i 9 znamenki. BEZ VREMENSKE ZONE nije obavezan i može se izostaviti. Ako S VREMENSKOM ZONOM je naveden, potreban je naziv vremenske zone ili pomak prema UTC-u.

Vremensku zonu možemo predstaviti u jednom od ova dva formata:

  • Naziv vremenske zone
  • Pomak od UTC ili slova Z za UTC

Za naš smo primjer odabrali PostgreSQL bazu podataka zahvaljujući njenoj punoj podršci za SQL tip VRIJEME S VREMENSKOM ZONOM.

Imajte na umu da druge baze podataka možda ne podržavaju ove vrste.

4. Mapiranje tipova datuma prije Java 8

Prije Jave 8, obično smo morali mapirati generičke tipove SQL VRIJEME, DATUM, i VREMENSKI KAMP, bilo za java.sql. * razreda java.sql.Vrijeme, java.sql.Date, i java.sql.Timestamp, odnosno ili java.util vrste java.util.Datum i java.util.Kalendar.

Prvo, pogledajmo kako koristiti java.sql vrste. Ovdje jednostavno definiramo atribute s java.sql vrste kao dio an @ Entitet razred:

@Entity javna klasa JPA22DateTimeEntity {private java.sql.Time sqlTime; privatna java.sql.Date sqlDate; private java.sql.Timestamp sqlTimestamp; // ...}

Dok java.sql tipovi rade kao bilo koji drugi tipovi bez ikakvog dodatnog mapiranja, java.util tipovi trebaju navesti odgovarajuće vremenske tipove.

To se radi kroz @Temporal napomena čija vrijednost atribut omogućuje nam da odredimo odgovarajući tip JDBC, koristeći TemporalType nabrajanje:

@Temporal (TemporalType.TIME) privatni java.util.Date utilTime; @Temporal (TemporalType.DATE) privatni java.util.Date utilDate; @Temporal (TemporalType.TIMESTAMP) privatna java.util.Date utilTimestamp;

Imajte na umu da ako Hibernate koristimo kao implementaciju, ovo ne podržava mapiranje Kalendar do VRIJEME.

Slično tome, možemo koristiti Kalendar razred:

@Temporal (TemporalType.TIME) privatni kalendar calendarTime; @Temporal (TemporalType.DATE) privatni kalendar calendarDate; @Temporal (TemporalType.TIMESTAMP) privatni kalendar CalendarTimestamp;

Nijedna od ovih vrsta nema podršku za vremensku zonu ili pomak. Da bismo se pozabavili tim informacijama, tradicionalno smo morali čuvati UTC vrijeme.

5. Mapiranje Java 8 tipova datuma

Java 8 je predstavila java.vrijeme paketi, a JDBC 4.2 API dodao je podršku za dodatne SQL tipove VREMENSKI KAMP SA VREMENSKIM ZONOM i VRIJEME S VREMENSKOM ZONOM.

Sada možemo mapirati JDBC vrste VRIJEME, DATUM, i VREMENSKI KAMP prema java.vrijeme vrsteLokalno vrijeme,LocalDate, i LocalDateTime:

@Column (name = "local_time", columnDefinition = "TIME") private LocalTime localTime; @Column (name = "local_date", columnDefinition = "DATE") private LocalDate localDate; @Column (name = "local_date_time", columnDefinition = "TIMESTAMP") private LocalDateTime localDateTime;

Pored toga, imamo podršku za pomak lokalne vremenske zone prema UTC-u putem OffsetTime i OffsetDateTime klase:

@Column (name = "offset_time", columnDefinition = "VRIJEME S VREMENSKOM ZONOM") private OffsetTime offsetTime; @Kolona (name = "offset_date_time", columnDefinition = "VREMENSKO VRIJEME S VREMENSKIM ZONOM") private OffsetDateTime offsetDateTime;

Odgovarajući mapirani tipovi stupaca trebali bi biti VRIJEME S VREMENSKOM ZONOM i VREMENSKI KAMP SA VREMENSKIM ZONOM. Nažalost, ne podržavaju sve baze podataka ove dvije vrste.

Kao što vidimo, JPA podržava ovih pet klasa kao osnovne tipove i ne postoje dodatne informacije potrebne za razlikovanje podataka o datumu i / ili vremenu.

Nakon spremanja nove instance naše klase entiteta, možemo provjeriti jesu li podaci pravilno umetnuti:

6. Zaključak

Prije Java 8 i JPA 2.2, programeri su obično morali pretvoriti vrste datuma / vremena u UTC prije nego što ih ustraju. JPA 2.2 sada podržava ovu značajku izvan okvira podržavajući pomak prema UTC-u i iskorištavajući podršku za vremensku zonu JDBC 4.2.

Potpuni izvorni kod za ove uzorke možete pronaći na Githubu.


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