מפות מתמשכות עם מצב שינה

1. הקדמה

במצב שינה, אנו יכולים לייצג יחסים בין רבים לשעועית הג'אווה שלנו בכך שאחד התחומים שלנו יהיה a רשימה.

במדריך מהיר זה נחקור דרכים שונות לעשות זאת באמצעות מַפָּה במקום זאת.

2. מַפָּההם שונים מ רשימהס

באמצעות א מַפָּה לייצג קשר של אחד לרבים שונה מ- a רשימה כי יש לנו מפתח.

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

אבל טבלת ההצטרפות הזו תהיה קצת שונה משולחנות צירוף אחרים בזה המפתח הראשי לא בהכרח יהיה מפתחות זרים להורה ולמטרה. במקום זאת, יהיה לנו שהמפתח הראשי יהיה מורכב של מפתח זר להורה ועמודה שהיא המפתח שלנו מַפָּה.

צמד ערכי המפתח ב- מַפָּה יכול להיות משני סוגים: סוג ערך וסוג ישות. בחלקים הבאים נבחן את הדרכים לייצג עמותות אלה במצב שינה.

3. שימוש @ MapKeyColumn

בוא נגיד שיש לנו להזמין ישות ואנחנו רוצים לעקוב אחר שם ומחיר של כל הפריטים בהזמנה. כך, אנחנו רוצים להציג א מַפָּה ל להזמין אשר ימפה את שם הפריט למחירו:

@Entity @Table (name = "orders") מחלקה ציבורית הזמנה {@Id @GeneratedValue @Column (name = "id") מזהה פרטי פרטי; @ElementCollection @CollectionTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}) @MapKeyColumn (name = "item_name") @Column (name = "price") פרטי פריט מפה PriceMap; // סטרים וקובעים סטנדרטיים}

עלינו לציין למצב שינה היכן להשיג את המפתח ואת הערך. בשביל המפתח, השתמשנו ב- @MapKeyטור, המציין כי מַפָּההמפתח הוא שם הפריט טור בטבלת ההצטרפות שלנו, מיפוי סדר_פריטים. בדומה לכך, @טור מציין כי ה- מפה הערך תואם את מחיר העמודה של טבלת ההצטרפות.

גַם, itemPriceMap האובייקט הוא מפת סוג הערך, ולכן עלינו להשתמש ב- @ElementCollection ביאור.

בנוסף לאובייקטים בסיסיים מסוג הערך, @ניתן להטמיע חפצים יכולים לשמש גם כ- מַפָּההערכים בצורה דומה.

4. שימוש @ MapKey

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

@Entity @Table (name = "item") מחלקה ציבורית פריט {@Id @GeneratedValue @Column (name = "id") מזהה פרטי פרטי; @Column (name = "name") פריט מחרוזת פרטי שם; @Column (name = "price") פריט כפול פרטי מחיר; @Column (name = "item_type") @ Enumerated (EnumType.STRING) פריט ItemType פרטי; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") תאריך פרטי onOn; // סטרים וקובעים סטנדרטיים}

בהתאם, בואו נשנה מַפָּה ל מַפָּה בתוך ה להזמין מחלקת ישויות:

@Entity @Table (name = "orders") מחלקה ציבורית הזמנה {@Id @GeneratedValue @Column (name = "id") מזהה פרטי פרטי; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}, inverseJoinColumn = {@JoinColumn (name = "item_id", referencedColumnName = "id")}) @ MapKey (name = "itemName") מפת פריט מפה; }

שים לב שהפעם נשתמש ב- @ MapKey ביאור כך ש'שינה הירח 'ישתמש פריט#שם הפריט כעמודה מפתח המפה במקום להציג עמודה נוספת בטבלת ההצטרפות. אז, במקרה זה, שולחן ההצטרפות מיפוי סדר_פריטיםאין עמודת מפתח במקום זאת הכוונה היא ל אניtemשמו.

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

גַם, itemMap היא מפת סוג ישות, ולכן עלינו להעלות הערה על הקשר באמצעות @אחד לרבים אוֹ @ManyToMany.

5. שימוש @ MapKeyEnumerated ו @ MapKeyTemporal

בכל פעם שאנו מציינים חלל כ- מַפָּה מפתח, אנו משתמשים @ MapKeyEnumerated. באופן דומה, עבור ערכים זמניים, @ MapKeyTemporal משמש. ההתנהגות די דומה לסטנדרט @נִפקָד ו @זְמַנִי ביאורים בהתאמה.

כברירת מחדל, אלה דומים ל- @ MapKeyColumn בתוך זה עמודת מפתח תיווצר בטבלת ההצטרפות. אם ברצוננו לעשות שימוש חוזר בערך שכבר נשמר ביישות הנמשכת, עלינו לסמן את השדה ב- @ MapKey.

6. שימוש @ MapKeyJoinColumn

לאחר מכן, נניח שעלינו לעקוב אחר המוכר של כל פריט. אחת הדרכים שנוכל לעשות זאת היא להוסיף א מוֹכֵר ישות ולקשור את זה שלנו פריט יֵשׁוּת:

@Entity @Table (name = "seller") מוכר בכיתה ציבורית {@Id @GeneratedValue @Column (name = "id") מזהה פרטי פרטי; @Column (name = "name") פרטי מחרוזת שם מחרוזת; // סטרים וקובעים סטנדרטיים}
@Entity @Table (name = "item") מחלקה ציבורית פריט {@Id @GeneratedValue @Column (name = "id") מזהה פרטי פרטי; @Column (name = "name") פריט מחרוזת פרטי שם; @Column (name = "price") פריט כפול פרטי מחיר; @Column (name = "item_type") @ Enumerated (EnumType.STRING) פריט ItemType פרטי; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") תאריך פרטי onOn; @ManyToOne (cascade = CascadeType.ALL) @JoinColumn (name = "seller_id") מוכר פרטי של מוכר; // סטרים וקובעים סטנדרטיים}

במקרה זה, נניח שמקרה השימוש שלנו הוא לקבץ הכל להזמיןשל פריטs על ידי מוֹכֵר. לפיכך, בואו נשנה מַפָּה ל מַפָּה:

@Entity @Table (name = "orders") מחלקה ציבורית הזמנה {@Id @GeneratedValue @Column (name = "id") מזהה פרטי פרטי; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}, inverseJoinColumn = {@JoinColumn (name = "item_id", referencedColumnName = "id")}) @ MapKeyJoinColumn (name = "seller_id") מפת פרטי sellerItemMap; // סטרים וקובעים סטנדרטיים}

אנחנו צריכים להוסיף @ MapKeyJoinColumn להשיג זאת מאחר שהביאור הזה מאפשר למצב שינה לשמור על מוכר_יד העמודה (מפתח המפה) בטבלת ההצטרפות מיפוי סדר_פריטים ביחד איתי מספר זיהוי של הפריט טור. לכן, בזמן קריאת הנתונים ממסד הנתונים, אנו יכולים לבצע א קבוצה לפי פעולה בקלות.

7. מסקנה

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

כמו תמיד, ניתן למצוא את קוד המקור של הדרכה זו דרך Github.


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