JPA 2.2 A Java 8 dátum / idő típusok támogatása

1. Áttekintés

A JPA 2.2 verzió hivatalosan bevezette a Java 8 támogatását Dátum és Idő API. Előtte vagy egy saját megoldásra kellett hagyatkoznunk, vagy pedig a JPA Converter API-t kellett használnunk.

Ebben az oktatóanyagban megmutatjuk, hogyan kell feltérképezni a különféle Java 8-at Dátum és Idő típusok. Különösen azokra fogunk összpontosítani, amelyek figyelembe veszik az ellentételezési információkat.

2. Maven-függőségek

Mielőtt elkezdenénk, be kell építenünk a JPA 2.2 API-t a projekt osztályútjába. Egy Maven-alapú projektben egyszerűen hozzáadhatjuk függőségét a miénkhez pom.xml fájl:

 javax.persistence javax.persistence-api 2.2 

Ezen túlmenően a projekt futtatásához szükségünk van egy JPA megvalósításra és az adatbázis JDBC illesztőprogramjára, amellyel együtt fogunk dolgozni. Ebben az oktatóanyagban az EclipseLink programot és a PostgreSQL adatbázist fogjuk használni:

 org.eclipse.persistence eclipselink 2.7.4 futásidejű org.postgresql postgresql 42.2.5 futásidejű csomag 

Ellenőrizze nyugodtan a JPA API, az EclipseLink és a PostgreSQL JDBC illesztőprogram legújabb verzióit a Maven Centralon.

Természetesen használhatunk más adatbázisokat vagy JPA-megvalósításokat is, mint például a Hibernate.

3. TimeZone támogatás

Bármely adatbázissal dolgozhatunk, de először meg kell vizsgálnunk ezen szabványos SQL típusok támogatását, mivel a JDBC 4.2 a következőkön alapul:

  • IDŐBETÉT (n) IDŐZÓNÁVAL
  • IDŐPONT (n) IDŐZÓNA NÉLKÜL
  • IDŐ (n) IDŐZÓNÁVAL
  • IDŐ (n) IDŐZÓNA NÉLKÜL

Itt, n a tört másodpercek pontossága és 0 és 9 számjegy között van. IDŐZÓNA NÉLKÜL opcionális és elhagyható. Ha IDŐZÓNÁVAL meg van adva, az időzóna neve vagy az UTC eltolása szükséges.

A két formátum egyikében ábrázolhatjuk az időzónát:

  • Időzóna neve
  • Eltérés az UTC-től vagy az UTC-hez tartozó Z betű

Például a PostgreSQL adatbázist választottuk, az SQL Type teljes támogatásának köszönhetően IDŐ AZ IDŐZónával.

Vegye figyelembe, hogy más adatbázisok nem támogatják ezeket a típusokat.

4. Dátumtípusok feltérképezése a Java 8 előtt

A Java 8 előtt általában az általános SQL típusokat kellett feltérképeznünk IDŐ, DÁTUM, és IDŐBÉLYEG, akár a java.sql. * osztályok java.sql.Time, java.sql.Date, és java.sql.Timestamp, ill java.util típusok java.util.Dátum és java.util.Naptár.

Először nézzük meg, hogyan kell használni a java.sql típusok. Itt egyszerűen meghatározzuk az attribútumokat java.sql típusok egy @Entity osztály:

@Entity nyilvános osztály JPA22DateTimeEntity {private java.sql.Time sqlTime; privát java.sql.Date sqlDate; privát java.sql.Timestamp sqlTimestamp; // ...}

Amíg a java.sql típusok minden más típushoz hasonlóan működnek, minden további feltérképezés nélkül, a java.util típusoknak meg kell adniuk a megfelelő időbeli típusokat.

Ez a @Időbeli annotáció kinek érték attribútum segítségével megadhatjuk a megfelelő JDBC típust a TemporalType felsorolás:

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

Ne feledje, hogy ha a hibernált állapotot használjuk megvalósításként, ez nem támogatja a leképezést Naptár nak nek IDŐ.

Hasonlóképpen használhatjuk a Naptár osztály:

@Temporal (TemporalType.TIME) privát naptár calendarTime; @Temporal (TemporalType.DATE) privát Naptár calendarDate; @Temporal (TemporalType.TIMESTAMP) privát Naptár calendarTimestamp;

Ezen típusok egyike sem támogatja az időzónát vagy az eltolást. Ezeknek az információknak a kezeléséhez hagyományosan az UTC-időt kellett tárolnunk.

5. Java 8 dátumtípusok feltérképezése

A Java 8 bemutatta a java.time csomagok, és a JDBC 4.2 API támogatást adott a további SQL típusokhoz IDŐBETÉT AZ IDŐZÓNÁVAL és IDŐ AZ IDŐZónával.

Most feltérképezhetjük a JDBC típusokat IDŐ, DÁTUM, és IDŐBÉLYEG hoz java.time típusokHelyi idő,LocalDate, és LocalDateTime:

@Column (név = "local_time", columnDefinition = "TIME") privát LocalTime localTime; @Column (név = "local_date", columnDefinition = "DATE") private LocalDate localDate; @Column (név = "local_date_time", columnDefinition = "TIMESTAMP") privát LocalDateTime localDateTime;

Emellett támogatjuk a helyi időzóna UTC-re történő eltolását a OffsetTime és OffsetDateTime osztályok:

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

A megfelelő leképezett oszloptípusoknak a következőknek kell lenniük IDŐ AZ IDŐZónával és IDŐBETÉT AZ IDŐZÓNÁVAL. Sajnos nem minden adatbázis támogatja ezt a két típust.

Mint láthatjuk, a JPA támogatja ezt az öt osztályt alaptípusként, és nincs szükség további információkra a dátum és / vagy az idő közötti információ megkülönböztetéséhez.

Az entitásosztályunk új példányának mentése után ellenőrizhetjük, hogy az adatokat helyesen illesztették-e be:

6. Következtetés

A Java 8 és a JPA 2.2 előtt a fejlesztőknek általában meg kellett konvertálniuk a dátum / idő típusokat UTC-re, mielőtt azok megmaradtak volna. A JPA 2.2 most már a dobozon kívül támogatja ezt a funkciót azáltal, hogy támogatja az UTC eltolást és kihasználja az időzóna JDBC 4.2 támogatását.

Ezeknek a mintáknak a teljes forráskódja megtalálható a Github oldalon.