Hibernálás - Dátum és idő feltérképezése

1. Bemutatkozás

Ebben a cikkben megmutatjuk, hogyan kell feltérképezni az időbeli oszlopértékeket a hibernált állapotban, beleértve a (z) osztályokat is java.sql, java.util és java.time csomagok.

2. Projekt beállítása

Az időbeli típusok leképezésének bemutatásához szükségünk lesz a H2 adatbázisra és a legújabb verzióra hibernált mag könyvtár:

 org. hibernálja a hibernált magot 5.4.12. Végső com.h2adatbázis h2 1.4.194 

Az aktuális verzióhoz hibernált mag könyvtár, menjen át a Maven Central adattárába.

3. Időzóna beállítása

A dátumok kezelésénél célszerű egy meghatározott időzónát beállítani a JDBC illesztőprogram számára. Így alkalmazásunk független lenne a rendszer aktuális időzónájától.

Például munkamenetenként állítjuk be:

session = HibernateUtil.getSessionFactory (). withOptions () .jdbcTimeZone (TimeZone.getTimeZone ("UTC")) .openSession ();

Egy másik módszer a hibernate.jdbc.time_zone tulajdonság a hibernált tulajdonságfájlban, amelyet a munkamenet-gyár létrehozására használnak. Így egyszer megadhatjuk az időzónát a teljes alkalmazáshoz.

4. Térképezés java.sql Típusok

A java.sql A csomag olyan JDBC típusokat tartalmaz, amelyek igazodnak az SQL szabvány által meghatározott típusokhoz:

  • Dátum megfelel a DÁTUM SQL típus, amely csak idő nélküli dátum
  • Idő megfelel a IDŐ SQL típus, amely órákban, percekben és másodpercekben megadott napszak
  • Időbélyeg dátummal és idővel kapcsolatos információkat tartalmaz, akár nanomásodpercekig, és megfelel a IDŐBÉLYEG SQL típus

Mivel ezek a típusok összhangban vannak az SQL-szel, ezért a leképezésük viszonylag egyszerű. Használhatjuk akár a @Alapvető vagy a @Oszlop kommentár:

@Entity public class TemporalValues ​​{@Basic private java.sql.Date sqlDate; @Basic privát java.sql.Time sqlTime; @Basic privát java.sql.Timestamp sqlTimestamp; }

Ezután beállíthatjuk a megfelelő értékeket, így:

temporalValues.setSqlDate (java.sql.Date.valueOf ("2017-11-15")); temporalValues.setSqlTime (java.sql.Time.valueOf ("15:30:14")); temporalValues.setSqlTimestamp (java.sql.Timestamp.valueOf ("2017-11-15 15: 30: 14.332"));

Ne feledje, hogy a választás java.sql Az entitásmezők típusai nem mindig lehetnek jó választások. Ezek az osztályok JDBC-specifikusak, és sok elavult funkciót tartalmaznak.

5. Térképezés java.util.Dátum típus

A típus java.util.Dátum dátum- és időinformációkat tartalmaz, akár milliszekundumos pontossággal. De nem kapcsolódik közvetlenül egyetlen SQL-típushoz sem.

Ezért szükségünk van egy másik kommentárra a kívánt SQL típus megadásához:

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

A @Időbeli az annotációnak egyetlen típusú értéke van TemporalType. Ez lehet akár DÁTUM, IDŐ vagy IDŐBÉLYEG, attól függően, hogy milyen SQL-típust akarunk használni a leképezéshez.

Ezután a megfelelő mezőket így állíthatjuk be:

temporalValues.setUtilDate (új SimpleDateFormat ("éééé-hh-dd"). elemzés ("2017-11-15")); temporalValues.setUtilTime (új SimpleDateFormat ("HH: mm: ss"). elemzés ("15:30:14")); temporalValues.setUtilTimestamp (új SimpleDateFormat ("éééé-hh-nn HH: mm: ss.SSS") .parse ("2017-11-15 15: 30: 14.332"));

Mint láttuk, a java.util.Dátum A típus (ezredmásodperces pontosság) nem elég pontos az időbélyeg (nanoszekundumos pontosság) kezeléséhez.

Tehát amikor lekérjük az entitást az adatbázisból, nem meglepő módon találunk egy java.sql.Timestamp példát ezen a területen, még akkor is, ha kezdetben kitartottunk java.util.Dátum:

temporalValues ​​= session.get (TemporalValues.class, temporalValues.getId ()); assertThat (temporalValues.getUtilTimestamp ()) .isEqualTo (java.sql.Timestamp.valueOf ("2017-11-15 15: 30: 14.332"));

Ennek jól kell lennie a kódunknak, mivel Időbélyeg kiterjed Dátum.

6. Térképezés java.util.Naptár típus

Mint a java.util.Dátum, a java.util.Naptár típusú lehet leképezni különböző SQL típusokra, ezért meg kell adnunk őket a @Időbeli.

Az egyetlen különbség az, hogy a hibernálás nem támogatja a leképezést Naptár nak nek IDŐ:

@Basic @Temporal (TemporalType.DATE) privát java.util.Calendar calendarDate; @Basic @Temporal (TemporalType.TIMESTAMP) privát java.util.Calendar calendarTimestamp;

Így állíthatjuk be a mező értékét:

Naptár calendarDate = Naptár.getInstance (TimeZone.getTimeZone ("UTC")); calendarDate.set (Calendar.YEAR, 2017); calendarDate.set (Calendar.MONTH, 10); calendarDate.set (Naptár.DAY_OF_MONTH, 15); temporalValues.setCalendarDate (calendarDate);

7. Térképezés java.time Típusok

A Java 8 óta az új Java Dátum és Idő API elérhető az időbeli értékek kezelésére. Ez az API kijavítja a java.util.Dátum és java.util.Naptár osztályok.

A típusok a java.time csomag közvetlenül a megfelelő SQL típusokhoz van hozzárendelve. Tehát nem kell kifejezetten meghatározni @Időbeli kommentár:

  • LocalDate fel van térképezve DÁTUM
  • Helyi idő és OffsetTime fel vannak térképezve IDŐ
  • Azonnali, LocalDateTime, OffsetDateTime és ZonedDateTime fel vannak térképezve IDŐBÉLYEG

Ez azt jelenti, hogy ezeket a mezőket csak a -val jelölhetjük @Alapvető (vagy @Oszlop) kommentár, így:

@Basic private java.time.LocalDate localDate; @Basic privát java.time.LocalTime localTime; @Basic privát java.time.OffsetTime offsetTime; @Basic privát java.time.Instant instant; @Basic privát java.time.LocalDateTime localDateTime; @Basic privát java.time.OffsetDateTime offsetDateTime; @Basic privát java.time.ZonedDateTime zonedDateTime;

Minden időbeli osztály a java.time a csomag statikus elemzés () módszer a megadott elemzésére Húr értéket a megfelelő formátum használatával. Így állíthatjuk be az entitásmezők értékeit:

temporalValues.setLocalDate (LocalDate.parse ("2017-11-15")); temporalValues.setLocalTime (LocalTime.parse ("15:30:18")); temporalValues.setOffsetTime (OffsetTime.parse ("08: 22: 12 + 01: 00")); temporalValues.setInstant (Instant.parse ("2017-11-15T08: 22: 12Z")); temporalValues.setLocalDateTime (LocalDateTime.parse ("2017-11-15T08: 22: 12")); temporalValues.setOffsetDateTime (OffsetDateTime.parse ("2017-11-15T08: 22: 12 + 01: 00")); temporalValues.setZonedDateTime (ZonedDateTime.parse ("2017-11-15T08: 22: 12 + 01: 00 [Európa / Párizs]"));

8. Következtetés

Ebben a cikkben bemutattuk, hogyan lehet feltérképezni a különböző típusú időbeli értékeket hibernált állapotban.

A cikk forráskódja elérhető a GitHubon.