FetchMode במצב שינה

1. הקדמה

במדריך קצר זה, נבחן אחר FetchMode ערכים שבהם אנו יכולים להשתמש @org.hibernate.annotations.Fetch ביאור.

2. הגדרת הדוגמא

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

לקוח בכיתה ציבורית @Entity {@Id @GeneratedValue פרטי מזהה ארוך; @OneToMany (mappedBy = "לקוח") @Fetch (value = FetchMode.SELECT) פרטי הגדר הזמנות = HashSet חדש (); // גטרים וקובעים}

כמו כן, ניצור להזמין ישות המורכבת מזהה, שם והפניה ל צרכן.

הזמנה בכיתה ציבורית @Entity {@Id @GeneratedValue פרטי מזהה ארוך; שם מחרוזת פרטי; @ManyToOne @JoinColumn (name = "customer_id") לקוח פרטי של לקוח; // גטרים וקובעים}

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

לקוח לקוח = customerRepository.findById (id) .get (); הגדר הזמנות = customer.getOrders ();

3. FetchMode.SELECT

על שלנו צרכן ישות, הערנו את הזמנות נכס עם @לְהָבִיא ביאור:

@OneToMany @Fetch (FetchMode.SELECT) הזמנות פרטיות;

אנו משתמשים @לְהָבִיא כדי לתאר כיצד מצב שינה צריך לאחזר את הנכס כאשר אנו מחפשים א צרכן.

באמצעות בחר מציין שיש לטעון את הנכס בעצלתיים.

פירוש הדבר שלשורה הראשונה:

לקוח לקוח = customerRepository.findById (id) .get ();

לא נראה צירוף לטבלת ההזמנות:

שינה: בחר ... מלקוח איפה customer0_.id =? 

וזה לשורה הבאה:

לקוח לקוח = customerRepository.findById (id) .get ();

נראה שאילתות עוקבות עבור ההזמנות הקשורות:

שינה: בחר ... מהסדר שבו order0_.customer_id =? 

ה שינה FetchMode.SELECT מייצר שאילתה נפרדת לכל אחד להזמין שצריך לטעון.

בדוגמה שלנו, זה נותן שאילתה אחת לטעינת הלקוחות וחמש שאילתות נוספות לטעינת אוסף ההזמנות.

זה ידוע בשם נ + 1 בחר בעיה. ביצוע שאילתה אחת יופעל נ שאילתות נוספות.

3.1. @BatchSize

FetchMode.SELECT יש הערת תצורה אופציונלית באמצעות @BatchSize ביאור:

@OneToMany @Fetch (FetchMode.SELECT) @BatchSize (גודל = 10) הזמנות פרטי להגדיר;

שינה ינסה לטעון את אוסף ההזמנות במנות שהוגדרו על ידי גודל פָּרָמֶטֶר.

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

אנו עדיין נשתמש באותה שאילתה:

שינה: בחר ... מהסדר שבו order0_.customer_id =?

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

4. FetchMode.JOIN

בזמן FetchMode.SELECT טוען יחסים בעצלתיים, FetchMode.JOIN טוען אותם בשקיקה, אמרו באמצעות צירוף:

@OneToMany @Fetch (FetchMode.JOIN) הזמנות פרטיות;

התוצאה היא שאילתה אחת בלבד עבור שניהם צרכן שלהם להזמיןs:

מצב שינה: בחר ... מלקוח הלקוח 0_ הזמנת הזמנת הצטרפות חיצונית שמאלית 1 ב- customer.id = order.customer_id היכן customer.id =?

5. FetchMode.SUBSELECT

בגלל ה הזמנות נכס הוא אוסף, נוכל גם להשתמש בו FetchMode.SUBSELECT:

@OneToMany @Fetch (FetchMode.SUBSELECT) הזמנות פרטיות;

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

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

שינה: בחר ... מלקוח הלקוח 0_ 

ושאילתה אחת עבור להזמיןs, תוך שימוש בתת-בחירה הפעם:

תרדמת שינה: בחר ... מ- order order0_ שבו order0_.customer_id ב (בחר customer0_.id מלקוח customer0_)

6. FetchMode לעומת. FetchType

בכללי, FetchMode מגדיר כיצד שינה יביא את הנתונים (על ידי בחירה, הצטרפות או בחירת משנה). FetchType, לעומת זאת, מגדיר האם תרדמת שינה תטען נתונים בשקיקה או בעצלתיים.

הכללים המדויקים בין שני אלה הם כדלקמן:

  • אם הקוד לא מוגדר FetchMode, ברירת המחדל היא לְהִצְטַרֵף ו FetchType עובד כהגדרתו

  • עם FetchMode.SELECT אוֹ FetchMode.SUBSELECT מַעֲרֶכֶת, FetchType עובד גם כהגדרתו
  • עם FetchMode.JOIN מַעֲרֶכֶת, FetchType מתעלמים ושאילתה תמיד להוטה

למידע נוסף אנא עיין בהוט / Lazy Loading in Hibernate.

7. מסקנה

במדריך זה למדנו על FetchMode'ערכים שונים וגם איך הם קשורים FetchType.

כמו תמיד כל קוד המקור זמין ב- GitHub.


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