JPA 2.2 Støtte for Java 8 dato / tidstyper

1. Oversikt

JPA 2.2-versjonen har offisielt introdusert støtten for Java 8 Dato og Tid API. Før det måtte vi enten stole på en proprietær løsning, eller så måtte vi bruke JPA Converter API.

I denne veiledningen, vi viser hvordan du kartlegger de forskjellige Java 8 Dato og Tid typer. Vi vil spesielt fokusere på de som tar hensyn til offsetinformasjonen.

2. Maven-avhengigheter

Før vi begynner, må vi inkludere JPA 2.2 API i prosjektklassen. I et Maven-basert prosjekt kan vi ganske enkelt legge til avhengighet til vårt pom.xml fil:

 javax.persistence javax.persistence-api 2.2 

I tillegg, for å kjøre prosjektet, trenger vi en JPA-implementering og JDBC-driveren til databasen som vi skal jobbe med. I denne opplæringen bruker vi EclipseLink og PostgreSQL-databasen:

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

Sjekk gjerne de nyeste versjonene av JPA API, EclipseLink og PostgreSQL JDBC-driveren på Maven Central.

Selvfølgelig kan vi bruke andre databaser eller JPA-implementeringer som Hibernate.

3. TimeZone-støtte

Vi kan jobbe med hvilken som helst database, men først bør vi sjekke støtten for disse standard SQL-typene, ettersom JDBC 4.2 er basert på:

  • TIDSTEMPEL (n) MED TIDSSONE
  • TIDSSTEMPEL (n) UTEN TIDSSONE
  • TID (n) MED TIDSSONE
  • TID (n) UTEN TIDSONE

Her, n er presisjonen på brøkdelen av sekunder og er mellom 0 og 9 sifre. UTEN TIDSSONE er valgfritt og kan utelates. Hvis MED TIDSSONE er spesifisert, kreves det tidssone navn eller forskyvning til UTC.

Vi kan representere tidssonen i ett av disse to formatene:

  • Tidssone navn
  • Forskyvning fra UTC eller bokstaven Z for UTC

For vårt eksempel har vi valgt PostgreSQL-databasen takket være full støtte for SQL Type TID MED TIDSSONE.

Merk at andre databaser kanskje ikke støtter disse typene.

4. Kartlegge datatyper før Java 8

Før Java 8 måtte vi vanligvis kartlegge de generiske SQL-typene TID, DATO, og TIDSTEMPEL, til enten java.sql. * klasser java.sql.Time, java.sql.Date, og java.sql.tidsstempel, henholdsvis, eller til java.util typer java.util.Date og java.util.Kalender.

La oss først se hvordan du bruker java.sql typer. Her definerer vi ganske enkelt attributtene med java.sql typer som en del av en @Enhet klasse:

@Entity offentlig klasse JPA22DateTimeEntity {privat java.sql.Time sqlTime; privat java.sql.Date sqlDate; privat java.sql.Timestamp sqlTimestamp; // ...}

Mens java.sql typer fungerer som alle andre typer uten ytterligere kartlegging, java.util typene må spesifisere de tilsvarende temporale typene.

Dette gjøres gjennom @Temporal kommentar hvis verdi -attributt lar oss spesifisere den tilsvarende JDBC-typen ved hjelp av TemporalType oppregning:

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

Merk at hvis vi bruker dvalemodus som en implementering, støtter dette ikke kartlegging Kalender til TID.

På samme måte kan vi bruke Kalender klasse:

@Temporal (TemporalType.TIME) privat kalender calendarTime; @Temporal (TemporalType.DATE) privat kalender calendarDate; @Temporal (TemporalType.TIMESTAMP) privat kalender calendarTimestamp;

Ingen av disse typene har støtte for tidssonen eller forskyvningen. For å håndtere disse informasjonene måtte vi tradisjonelt lagre UTC-tiden.

5. Kartlegging av Java 8 datatyper

Java 8 har introdusert java.time pakker, og JDBC 4.2 API lagt til støtte for de ekstra SQL-typene TIDSSTEMPEL MED TIDSSONE og TID MED TIDSSONE.

Vi kan nå kartlegge JDBC-typene TID, DATO, og TIDSTEMPEL til java.time typerLokal tid,LocalDate, og LocalDateTime:

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

I tillegg har vi støtte for den kompenserte lokale tidssonen til UTC gjennom OffsetTime og OffsetDateTime klasser:

@Column (name = "offset_time", columnDefinition = "TID MED TIDSSONE") privat OffsetTime offsetTime; @Column (name = "offset_date_time", columnDefinition = "TIMESTAMP WITH TIME ZONE") privat OffsetDateTime offsetDateTime;

De tilsvarende kartlagte kolonnetypene skal være TID MED TIDSSONE og TIDSSTEMPEL MED TIDSSONE. Dessverre støtter ikke alle databaser disse to typene.

Som vi kan se, støtter JPA disse fem klassene som grunnleggende typer, og det er ingen tilleggsinformasjon nødvendig for å skille mellom dato- og / eller tidsinformasjonen.

Etter å ha lagret en ny forekomst av enhetsklassen vår, kan vi sjekke at data er satt inn riktig:

6. Konklusjon

Før Java 8 og JPA 2.2 måtte utviklere vanligvis konvertere dato / tidstyper til UTC før de vedvarte dem. JPA 2.2 støtter nå denne funksjonen ut av boksen ved å støtte forskyvningen til UTC og ved å utnytte JDBC 4.2-støtte for tidssonen.

Den fullstendige kildekoden for disse prøvene finner du på Github.


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