JPA 2.2 תמיכה ב- Java 8 סוגי תאריך / שעה

1. סקירה כללית

גרסת JPA 2.2 הציגה רשמית את התמיכה בג'אווה 8 תַאֲרִיך ו זְמַן ממשק API. לפני כן היינו צריכים להסתמך על פיתרון קנייני או שהיינו צריכים להשתמש ב- JPA Converter API.

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

2. תלות Maven

לפני שנתחיל, עלינו לכלול את ה- API של JPA 2.2 אל מסלול הכיתה של הפרויקט. בפרויקט מבוסס Maven, אנו יכולים פשוט להוסיף את התלות שלו בפרויקט שלנו pom.xml קוֹבֶץ:

 javax.persistence javax.persistence-api 2.2 

בנוסף, כדי להפעיל את הפרויקט, אנו זקוקים ליישום JPA ולנהג ה- JDBC של מסד הנתונים שאיתו נעבוד. במדריך זה נשתמש ב- EclipseLink ובסיס הנתונים של PostgreSQL:

 org.eclipse.persistence eclipselink 2.7.4 זמן ריצה org.postgresql postgresql 42.2.5 זמן ריצה 

אל תהסס לבדוק את הגירסאות העדכניות ביותר של JPA API, EclipseLink ו- Driver JDBC של PostgreSQL ב- Maven Central.

כמובן, אנו יכולים להשתמש בבסיסי נתונים אחרים או ביישומי JPA כמו Hibernate.

3. TimeZone תמיכה

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

  • TIMESTAMP (n) עם אזור זמן
  • TIMESTAMP (n) ללא אזור זמן
  • זמן (n) עם אזור זמן
  • זמן (n) ללא אזור זמן

פה, נ הוא דיוק השניות השבר והוא בין 0 ל -9 ספרות. ללא אזור זמן הוא אופציונלי וניתן להשמיט אותו. אם עם אזור זמן מוגדר, נדרש שם אזור הזמן או הקיזוז ל- UTC.

אנו יכולים לייצג את אזור הזמן באחד משני הפורמטים הבאים:

  • שם אזור הזמן
  • קיזוז מ- UTC או האות Z עבור UTC

לדוגמא שלנו, בחרנו במסד הנתונים PostgreSQL הודות לתמיכתו המלאה בסוג ה- SQL זמן עם אזור זמן.

שים לב שמאגרי מידע אחרים עשויים שלא לתמוך בסוגים אלה.

4. מיפוי סוגי תאריכים לפני Java 8

לפני Java 8, בדרך כלל היינו צריכים למפות את סוגי ה- SQL הגנריים זמן תאריך, ו TIMESTAMP, לאחד מה java.sql. * שיעורים java.sql.Time, java.sql.Date, ו java.sql. חותמת זמן, בהתאמה, או ל java.util סוגים java.util.Date ו java.util.Calendar.

ראשית, בוא נראה כיצד להשתמש ב- java.sql סוגים. כאן אנו פשוט מגדירים את התכונות באמצעות java.sql סוגים כחלק מ @יֵשׁוּת מעמד:

מחלקה ציבורית @Entity JPA22DateTimeEntity {פרטי java.sql.Time sqlTime; פרטי java.sql.Date sqlDate; פרטי java.sql.Timestamp sqlTimestamp; // ...}

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

זה נעשה באמצעות @זְמַנִי ביאור של מי ערך המאפיין מאפשר לנו לציין את סוג JDBC המתאים, באמצעות TemporalType ספירה:

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

שים לב שאם אנו משתמשים ב- Hibernate כהטמעה, הדבר אינו תומך במיפוי לוּחַ שָׁנָה ל זְמַן.

באופן דומה, אנו יכולים להשתמש ב- לוּחַ שָׁנָה מעמד:

@Temporal (TemporalType.TIME) לוח שנה פרטי CalendarTime; @Temporal (TemporalType.DATE) לוח שנה פרטי CalendarDate; @Temporal (TemporalType.TIMESTAMP) לוח שנה פרטי לוח שנה Timestamp;

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

5. מיפוי Java 8 סוגי תאריכים

ג'אווה 8 הציגה את java.time חבילות, ו- JDBC 4.2 API הוסיפו תמיכה בסוגי ה- SQL הנוספים זמן טמפ 'עם אזור זמן ו זמן עם אזור זמן.

כעת אנו יכולים למפות את סוגי JDBC זמן תאריך, ו TIMESTAMP אל ה java.time סוגיםזמן מקומי,LocalDate, ו LocalDateTime:

@Column (name = "local_time", columnDefinition = "TIME") פרטי LocalTime localTime; @Column (name = "local_date", columnDefinition = "DATE") LocalDate פרטי LocalDate; @Column (name = "local_date_time", columnDefinition = "TIMESTAMP") LocalDateTime פרטי LocalDateTime;

בנוסף, יש לנו תמיכה בקיזוז אזור הזמן המקומי ל- UTC דרך ה- OffsetTime ו OffsetDateTime שיעורים:

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

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

כפי שאנו רואים, JPA תומך בחמשת הכיתות הללו כסוגים בסיסיים, ואין צורך במידע נוסף כדי להבחין בין תאריך ו / או מידע על השעה.

לאחר שמירת מופע חדש של מחלקת הישויות שלנו, אנו יכולים לבדוק שהנתונים הוכנסו כהלכה:

6. מסקנה

לפני Java 8 ו- JPA 2.2, בדרך כלל היה על המפתחים להמיר סוגי תאריך / שעה ל- UTC לפני שהתמידו בהם. JPA 2.2 תומך כעת בתכונה זו מחוץ לקופסה על ידי תמיכה בקיזוז ל- UTC ועל ידי מינוף תמיכה ב- JDBC 4.2 באזור הזמן.

קוד המקור המלא עבור דוגמאות אלה ניתן למצוא באתר Github.


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