תרדמת שינה - מיפוי תאריך ושעה

1. הקדמה

במאמר זה נראה כיצד למפות ערכי עמודות זמניים במצב שינה, כולל הכיתות מ- java.sql, java.util ו java.time חבילות.

2. הגדרת פרויקט

כדי להדגים את מיפוי הסוגים הזמניים, נצטרך את מסד הנתונים H2 ואת הגרסה האחרונה של ה- ליבת שינה סִפְרִיָה:

 org.hibernate hibernate-core 5.4.12. com.h2database h2 1.4.194 

לגרסה הנוכחית של ליבת שינה הספרייה, עבור אל המאגר המרכזי של Maven.

3. הגדרת אזור זמן

כאשר מתמודדים עם תאריכים, מומלץ להגדיר אזור זמן ספציפי עבור מנהל ההתקן JDBC. בדרך זו היישום שלנו יהיה בלתי תלוי באזור הזמן הנוכחי של המערכת.

לדוגמא שלנו, נגדיר זאת על בסיס מפגש:

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

דרך נוספת תהיה להקים את hibernate.jdbc.time_zone מאפיין בקובץ מאפייני תרדמה המשמש לבניית מפעל ההפעלה. בדרך זו נוכל לציין את אזור הזמן פעם אחת עבור היישום כולו.

4. מיפוי java.sql סוגים

ה java.sql החבילה מכילה סוגי JDBC המתואמים לסוגים המוגדרים על ידי תקן SQL:

  • תַאֲרִיך תואם את תַאֲרִיך סוג SQL, שהוא תאריך בלבד ללא זמן
  • זְמַן תואם את זְמַן סוג SQL, שהוא זמן ביום שצוין בשעות, דקות ושניות
  • חותמת זמן כולל מידע על תאריך ושעה בדיוק עד ננו שניות ותואם את TIMESTAMP סוג SQL

מכיוון שסוגים אלה עולים בקנה אחד עם SQL, כך המיפוי שלהם פשוט יחסית. אנחנו יכולים להשתמש ב- @בסיסי או ה @טור ביאור:

מעמד ציבורי @Entity TemporalValues ​​{@Basic פרטי java.sql.Date sqlDate; @ בסיסי פרטי java.sql.Time sqlTime; @ בסיסי פרטי java.sql.Timestamp sqlTimestamp; }

נוכל להגדיר את הערכים המתאימים כך:

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

שים לב שבחירה java.sql לא תמיד סוגים עבור שדות ישויות הם בחירה טובה. שיעורים אלה הם ספציפיים ל- JDBC ומכילים הרבה פונקציונליות שהוצא משימוש.

5. מיפוי java.util.Date סוּג

הסוג java.util.Date מכיל מידע על תאריך ושעה, עד דיוק באלפיות השנייה. אבל זה לא קשור ישירות לשום סוג SQL.

זו הסיבה שאנחנו צריכים הערה נוספת כדי לציין את סוג ה- SQL הרצוי:

@Basic @Temporal (TemporalType.DATE) java.util.Date פרטי פרטי; @Basic @Temporal (TemporalType.TIME) פרטי java.util.Date utilTime; @Basic @Temporal (TemporalType.TIMESTAMP) פרטי java.util.Date utilTimestamp;

ה @זְמַנִי להערה ערך הפרמטר היחיד מהסוג TemporalType. זה יכול להיות גם תַאֲרִיך, זְמַן אוֹ TIMESTAMP, תלוי בסוג ה- SQL הבסיסי בו אנו רוצים להשתמש למיפוי.

נוכל להגדיר את השדות המתאימים כך:

temporalValues.setUtilDate (SimpleDateFormat חדש ("yyyy-MM-dd"). ניתוח ("2017-11-15")); temporalValues.setUtilTime (SimpleDateFormat חדש ("HH: mm: ss"). ניתוח ("15:30:14")); temporalValues.setUtilTimestamp (SimpleDateFormat חדש ("yyyy-MM-dd HH: mm: ss.SSS") .parse ("2017-11-15 15: 30: 14.332"));

כפי שראינו, ה java.util.Date סוג (דיוק באלפיות השנייה) אינו מדויק מספיק בכדי להתמודד עם ערך חותמת הזמן (דיוק ננו-שניות).

לכן כאשר אנו מאחזרים את הישות ממסד הנתונים, לא נמצא באופן מפתיע א java.sql. חותמת זמן למשל בתחום זה, גם אם בתחילה התמידנו א java.util.Date:

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

זה אמור להיות בסדר עבור הקוד שלנו מאז חותמת זמן מרחיב תַאֲרִיך.

6. מיפוי java.util.Calendar סוּג

כמו עם java.util.Date, ה java.util.Calendar ניתן למפות את הסוג לסוגי SQL שונים, ולכן עלינו לציין אותם באמצעות @זְמַנִי.

ההבדל היחיד הוא שמצב שינה אינו תומך במיפוי לוּחַ שָׁנָה ל זְמַן:

@Basic @Temporal (TemporalType.DATE) פרטי java.util.Calendar לוח תאריך; @Basic @Temporal (TemporalType.TIMESTAMP) פרטי java.util.Calendar לוח שנה Timestamp;

כך נקבע את ערך השדה:

לוח שנה calendarDate = Calendar.getInstance (TimeZone.getTimeZone ("UTC")); calendarDate.set (Calendar.YEAR, 2017); calendarDate.set (Calendar.MONTH, 10); calendarDate.set (Calendar.DAY_OF_MONTH, 15); temporalValues.setCalendarDate (calendarDate);

7. מיפוי java.time סוגים

מאז Java 8, ה- API החדש של Java Date and Time זמין להתמודדות עם ערכים זמניים. ממשק API זה פותר בעיות רבות של java.util.Date ו java.util.Calendar שיעורים.

הסוגים מה- java.time החבילה ממופה ישירות לסוגי SQL המתאימים. אז אין צורך לפרט במפורש @זְמַנִי ביאור:

  • LocalDate ממופה ל תַאֲרִיך
  • זמן מקומי ו OffsetTime ממופים ל זְמַן
  • רֶגַע, LocalDateTime, OffsetDateTime ו ZonedDateTime ממופים ל TIMESTAMP

המשמעות היא שנוכל לסמן את השדות הללו רק ב- @בסיסי (אוֹ @טורביאור, כך:

@ בסיסי פרטי java.time.LocalDate localDate; @Basic פרטי java.time.LocalTime localTime; @ Basic פרטי java.time.OffsetTime offsetTime; @Basic פרטי java.time.Instant מיידי; @Basic פרטי java.time.LocalDateTime localDateTime; @Basic פרטי java.time.OffsetDateTime offsetDateTime; @ בסיסי פרטי java.time.ZonedDateTime zonedDateTime;

כל שיעור זמני java.time החבילה כוללת סטטי לְנַתֵחַ() שיטה לנתח את הניתנים חוּט ערך באמצעות הפורמט המתאים. אז כך נוכל להגדיר את הערכים של שדות הישות:

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 [Europe / Paris]"));

8. מסקנה

במאמר זה, הראינו כיצד למפות ערכים זמניים מסוגים שונים במצב שינה.

קוד המקור של המאמר זמין באתר GitHub.


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