מדריך לספריית סוגי שינה

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

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

2. תלות

כדי להפעיל סוגי שינה במצב פשוט נוסיף את המתאים סוגי שינה תלות:

 com.vladmihalcea hibernate-types-52 2.9.7 

זה יעבוד עם גרסאות שינה 5.4, 5.3, ו 5.2.

במקרה שגרסת ה- Hibernate ישנה יותר, artifactId הערך שלמעלה יהיה שונה. לגרסאות 5.1 ו 5.0, אנחנו יכולים להשתמש מצב שינה-51. באופן דומה, גרסה 4.3 דורש סוגי שינה -43, וגרסאות 4.2, ו- 4.1 דורשים מצב שינה-4.

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

לכן, כדי להריץ וליצור את מסד הנתונים שלנו עלינו לבצע רק:

$ ./create-database.sh

3. מאגרי מידע נתמכים

אנו יכולים להשתמש בסוגים שלנו עם מסדי נתונים של Oracle, SQL Server, PostgreSQL ו- MySQL. לכן, מיפוי הסוגים בג'אווה לסוגי עמודות מסד הנתונים ישתנה בהתאם למסד הנתונים בו אנו משתמשים. במקרה שלנו, נשתמש ב- MySQL ונמפה את ה- JsonBinaryType לסוג עמודות JSON.

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

4. מודל נתונים

מודל הנתונים של הדרכה זו יאפשר לנו לאחסן מידע על אלבומים ושירים. באלבום יש אומנות כיסוי ושיר אחד או יותר. לשיר יש אמן ואורך. לעטיפת העטיפה יש שתי כתובות URL של תמונה וקוד UPC. לבסוף, לאמן יש שם, מדינה וז'אנר מוזיקלי.

בעבר היינו יוצרים טבלאות לייצוג כל הנתונים במודל שלנו. אבל, כעת, כשיש לנו סוגים זמינים עבורנו, אנו יכולים לאחסן בקלות חלק מהנתונים כ- JSON במקום זאת.

להדרכה זו ניצור טבלאות רק לאלבומים ולשירים:

אלבום בכיתה ציבורית מרחיב את BaseEntity {@Type (type = "json") @Column (columnDefinition = "json") CoverArt פרטי Coverart; @OneToMany (fetch = FetchType.EAGER) שירים ברשימה פרטית; // חברי כיתה אחרים}
שיר בכיתה ציבורית מרחיב את BaseEntity {פרטי אורך ארוך = 0L; @Type (type = "json") @Column (columnDefinition = "json") אמן אמן פרטי; // חברי כיתה אחרים}

משתמש ב JsonStringType נציג את אומנות העטיפה והאמנים כעמודי JSON בטבלאות אלה:

מעמד ציבורי אמן מיישם את Serializable {private String name; מדינה מחרוזת פרטית; ז'אנר מיתרים פרטי; // חברי כיתה אחרים}
יישומי CoverArt ממעמד ציבורי יכולים להתבצע באמצעות Serializable {private String frontCoverArtUrl; פרטי מחרוזת backCoverArtUrl; פרטי מחרוזת upcCode; // חברי כיתה אחרים}

חשוב לציין כי אמן ו אמנות כיסוי שיעורים הם POJOs ולא ישויות. יתר על כן, הם חברים בכיתות ישויות בסיס הנתונים שלנו, המוגדרים באמצעות ה- @Type (type = “json”) ביאור.

4.1. אחסון סוגי JSON

הגדרנו את דגמי האלבום והשירים שלנו כדי להכיל חברים שמאגר הנתונים יאחסן כ- JSON. זה נובע משימוש בתנאי ג'סון סוּג. על מנת שיהיה לנו סוג זה זמין לשימוש עלינו להגדיר אותו באמצעות הגדרת סוג:

@TypeDefs ({@TypeDef (name = "json", typeClass = JsonStringType.class), @TypeDef (name = "jsonb", typeClass = JsonBinaryType.class)}) מעמד ציבורי BaseEntity {// חברי כיתה}

ה @סוּג ל JsonStringType ו JsonBinaryType עושה את הסוגים ג'סון ו jsonb זמין.

הגרסאות האחרונות של MySQL תומכות ב- JSON כסוג עמודות. כתוצאה מכך, JDBC מעבד כל קריאת JSON או כל אובייקט שנשמר בעמודה עם אחד מהסוגים האלה כ- חוּט. המשמעות היא שכדי למפות נכון את העמודה עלינו להשתמש JsonStringType בהגדרת הסוג שלנו.

4.2. שינה

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

הכניסו לערכי שיר (שם, אמן, אורך, מזהה) ('A Happy Song', '{"name": "Superstar", "country": "England", "genre": "Pop"}', 240, 3); הכנס לערכי שיר (שם, אמן, אורך, מזהה) ('שיר עצוב', '{"שם": "סופרסטאר", "מדינה": "אנגליה", "ז'אנר": "פופ"}', 120, 4); הכנס לערכי שיר (שם, אמן, אורך, מזהה) ('שיר חדש', '{"שם": "עולה חדש", "מדינה": "ג'מייקה", "ז'אנר": "רגאיי"}', 300, 6) הכנס לערכי אלבום (שם, cover_art, id) ('אלבום 0', '{"frontCoverArtUrl": "// fakeurl-0", "backCoverArtUrl": "// fakeurl-1", "upcCode": " b2b9b193-ee04-4cdc-be8f-3a276769ab5b "} ', 7) 

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

5. אחסון סוגי גנריות

מלבד תמיכה בעמודות מבוססות JSON, הספרייה מוסיפה גם כמה סוגי גנריות: שנת חודש, שָׁנָה, ו חוֹדֶשׁ מ ה java.time חֲבִילָה.

כעת נוכל למפות את הסוגים הללו שאינם נתמכים באופן מקורי על ידי Hibernate או JPA. כמו כן, כעת יש לנו את היכולת לאחסן אותם כ- מספר שלם, חוּט, אוֹ תַאֲרִיך טור.

לדוגמא, נניח שאנחנו רוצים להוסיף את התאריך המוקלט של שיר שלנו שִׁיר לדגם ולאחסן אותו כ- מספר שלם במסד הנתונים שלנו. אנחנו יכולים להשתמש ב- YearMonthIntegerType בשלנו שִׁיר הגדרת כיתת ישות:

@TypeDef (typeClass = YearMonthIntegerType.class, defaultForType = YearMonth.class) מחלקה ציבורית שיר מרחיב את BaseEntity {@Column (name = "recording_on", columnDefinition = "mediumint") פרטי YearMonth recordingOn = YearMonth.now (); // חברי כיתה אחרים} 

שֶׁלָנוּ מוקלט On ערך הנכס מתורגם ל- סוג קלאס סיפקנו. כתוצאה, ממיר שהוגדר מראש יחזיק את הערך במסד הנתונים שלנו כ- מספר שלם.

6. שיעורי שירות אחרים

ל- Hibernate Types יש כמה שיעורי עוזר המשפרים עוד יותר את חווית המפתח בעת שימוש ב- Hibernate.

ה CamelCaseToSnakeCaseNamingStrategy ממפה מאפיינים עם מעטפת גמלים בשיעורי Java שלנו לעמודות עם מעטפות נחש במאגר המידע שלנו.

ה ClassImportIntegrator מאפשר ערכי שמות מחלקה פשוטים ב- Java DTO בפרמטרים של בנאי JPA.

יש גם את ListResultTransformer וה MapResultTransformer שיעורים המספקים יישומים נקיים יותר של אובייקטי התוצאה המשמשים את JPA. בנוסף, הם תומכים בשימוש במבדות ומספקים תאימות לאחור עם גרסאות JPA ישנות יותר.

7. מסקנה

במדריך זה הצגנו את ספריית Java של Hibernate Types ואת הסוגים החדשים שהיא מוסיפה ל- Hibernate ו- JPA. בדקנו גם כמה מתוכנות השירות והסוגים הגנריים שמספקת הספרייה.

היישום של הדוגמאות וקטעי הקוד זמין ב- GitHub.


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