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.