אביב נתונים JPA @ הערת שינוי

1. הקדמה

במדריך הקצר הזה, נלמד כיצד ליצור שאילתות עדכון באמצעות ה- JPA של Spring Data @שאילתא ביאור. נשיג זאת באמצעות ה- @ שינוי ביאור.

ראשית, נרענן את זיכרוננו ונראה כיצד לבצע שאילתות באמצעות Spring Data JPA. לאחר מכן, נצלול עמוק לשימוש ב- @שאילתא ו @ שינוי ביאורים. לבסוף נראה כיצד לנהל את מצב הקשר ההתמדה שלנו בעת שימוש בשאילתות משנה.

2. שאילתות ב- Spring Data JPA

ראשית, בואו נסכם את 3 מנגנונים ש- Spring Data JPA מספקים לצורך שאילתת נתונים במסד נתונים:

  • שיטות שאילתה
  • @שאילתא ביאור
  • יישום מאגר מותאם אישית

בואו ניצור מִשׁתַמֵשׁ בכיתה ומאגר JPA תואם של Spring Data להמחשת מנגנונים אלה:

@Entity @Table (name = "משתמשים", schema = "משתמשים") משתמש בכיתה ציבורית {@Id @GeneratedValue (אסטרטגיה = GenerationType.IDENTITY) פרטי מזהה; שם מחרוזת פרטי; פרטי LocalDate creationDate; פרטי LocalDate lastLoginDate; פעיל בוליאני פעיל; דוא"ל מחרוזת פרטי; }
ממשק ציבורי UserRepository מרחיב את JpaRepository {}

מנגנון שיטות השאילתה מאפשר לנו לתפעל את הנתונים על ידי הפיכת השאילתות משמות השיטות:

רשימה findAllByName (שם מחרוזת); בטל deleteAllByCreationDateAfter (תאריך LocalDate);

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

בנוגע ל @שאילתא ביאור, זה מספק לנו את האפשרות לכתוב שאילתת JPQL או SQL ספציפית ב @שאילתא ביאור:

@Query ("בחר u מהמשתמש u שבו u.email כמו '%@gmail.com'") רשימה findUsersWithGmailAddress ();

בקטע קוד זה אנו יכולים לראות שאילתה מאחזרת משתמשים שיש להם @ gmail.com כתובת דוא"ל.

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

3. באמצעות @ שינוי ביאור

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

בואו נשחק קצת עם ההערה הזו ונראה ממה היא עשויה.

ראשית, בואו נראה דוגמה של א @ שינוי שאילתת עדכון:

@Modifying @Query ("עדכן את המשתמש להגדיר u.active = false כאשר u.lastLoginDate <: תאריך") בטל ביטול הפעלהUsersNotLoggedInSince (@Param ("תאריך") תאריך LocalDate);

הנה, אנו משביתים את המשתמשים שלא התחברו מאז תאריך נתון.

בואו ננסה עוד אחד שבו נמחק משתמשים מושבתים:

@Modifying @Query ("מחק משתמש u שם u.active = false") int deleteDeactivatedUsers ();

כפי שאנו רואים, שיטה זו מחזירה מספר שלם. זו תכונה של Spring Data JPA @ שינוי שאילתות המספקות לנו את מספר הגופים המעודכנים.

עלינו לציין כי ביצוע שאילתת מחיקה עם @שאילתא עובד אחרת מ- JPA של Spring Data deleteBy שיטות שאילתה שמקורן בשמות. האחרון מביא תחילה את הישויות ממסד הנתונים ואז מוחק אותן אחת אחת. לפיכך, המשמעות היא ששיטת מחזור החיים @PreRemove ייקראו לגופים ההם. עם זאת, עם הראשון, שאילתה אחת מתבצעת כנגד מסד הנתונים.

לסיום, בואו נוסיף a נמחק טור שלנו משתמשים שולחן עם DDL שאילתא:

@Modifying @Query (value = "לשנות טבלה USERS.USERS להוסיף עמודה שנמחקה int (1) לא null ברירת מחדל 0", nativeQuery = true) ריק addDeletedColumn ();

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

4. ניהול הקשר ההתמדה

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

עם זאת, איננו צריכים להתקשר במפורש ל- ברור() שיטה על EntityManager. אנחנו יכולים פשוט להשתמש ב- ברור באופן אוטומטי נכס מה @ שינוי ביאור:

@Modifying (clearAutomatically = true)

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

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

@Modifying (flushAutomatically = true)

עכשיו ה EntityManager נשטף לפני ביצוע השאילתה שלנו.

5. מסקנה

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

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


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