מחיקת נתונים JPA ומערכת יחסים

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

במדריך זה, נבחן כיצד מתבצעת מחיקה ב- Spring Data JPA.

2. ישות לדוגמא

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

אם יש לנו ישות, כמו סֵפֶר:

@Entity class class ספר {@Id @GeneratedValue פרטי מזהה ארוך; כותרת מחרוזת פרטית; // בונים סטנדרטיים // גטרים וקובעים סטנדרטיים}

לאחר מכן, אנו יכולים להאריך את נתוני ה- JPA של Spring Data מאגר Crud לתת לנו גישה לפעולות CRUD ב סֵפֶר:

ממשק ציבורי @ מאגר @ BookRepository מרחיב את CrudRepository {}

3. מחק ממאגר

בין היתר, מאגר Crud מכיל שתי שיטות: deleteById ו מחק הכל.

בואו נבדוק שיטות אלה ישירות משלנו מאגר ספרים:

@RunWith (SpringRunner.class) @SpringBootTest (מחלקות = {Application.class}) מחלקה ציבורית DeleteFromRepositoryUnitTest {@ מאגר פרטי BookRepository פרטי; ספר ספר 1; ספר ספר 2; ספרי רשימה; // אתחול נתונים @ טסט ציבורי בטל כאשר מחיקתאבידיפרומטר_מאגר_את-מחיקת-שובל-מוצלח () {repository.deleteById (book1.getId ()); assertThat (repository.count ()). isEqualTo (1); } @ מבחן ציבורי בטל כאשר מחק את כל המפרטים מאגר_מאגר המאגר צריך להיות () {repository.deleteAll (); assertThat (repository.count ()). isEqualTo (0); }}

ולמרות שאנחנו משתמשים מאגר Crud, שים לב שאותן שיטות קיימות לממשקי JPA אחרים של Spring Data כמו מאגר Jpa אוֹ PagingAndSortingRepository.

4. שאילתת מחיקה נגזרת

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

שאילתת מחיקה נגזרת חייבת להתחיל עם deleteBy, ואחריו שם קריטריוני הבחירה. יש לספק את הקריטריונים הללו בשיחת השיטה.

בואו נגיד שאנחנו רוצים למחוק סֵפֶרs על ידי כותרת. באמצעות אמנת השמות, היינו מתחילים איתה deleteBy ורשימה כותרת כקריטריונים שלנו:

ממשק ציבורי @ מאגר @ BookRepository מרחיב את CrudRepository {long deleteByTitle (כותרת מחרוזת); }

ערך ההחזר, מהסוג ארוך, מציין כמה רשומות השיטה נמחקה.

בואו נכתוב מבחן ונוודא שהוא נכון:

@Test @ Transactional public void whenDeleteFromDerivedQuery_thenDeletingShouldBeSuccessful () {long deleteRecords = repository.deleteByTitle ("ההוביט"); assertThat (deleteRecords) .isEqualTo (1); }

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

5. שאילתת מחיקה מותאמת אישית

שמות השיטות לשאילתות נגזרות יכולות להיות ארוכות למדי, והן מוגבלות לטבלה אחת בלבד.

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

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

@Modifying @Query ("מחק מהספר b שבו b.title =: כותרת") בטל deleteBooks (@Param ("כותרת") כותרת מחרוזת);

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

@Test @ Transactional public void whenDeleteFromCustomQuery_thenDeletingShouldBeSuccessful () {repository.deleteBooks ("ההוביט"); assertThat (repository.count ()). isEqualTo (1); }

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

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

6. מחק בזוגיות

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

נניח שיש לנו קטגוריה ישות, שיש לה אחד לרבים קשר עם סֵפֶר יֵשׁוּת:

@Entity Class class Category {@Id @GeneratedValue פרטי מזהה ארוך; שם מחרוזת פרטי; @OneToMany (mappedBy = "category", cascade = CascadeType.ALL, orphanRemoval = true) ספרי רשימות פרטיים; // בונים סטנדרטיים // גטרים וקובעים סטנדרטיים}

ה קטגוריה מאגר יכול פשוט להיות ממשק ריק שמתארך מאגר Crud:

ממשק ציבורי @ מאגר קטגוריה מאגר מרחיב CrudRepository {}

עלינו גם לשנות את סֵפֶר ישות שתשקף את הקשר הזה:

קטגוריית קטגוריה פרטית @ManyToOne;

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

@Test הציבור בטל כאשרDeletingCategories_thenBooksShouldAlsoBeDeleted () {categoryRepository.deleteAll (); assertThat (bookRepository.count ()). isEqualTo (0); assertThat (categoryRepository.count ()). isEqualTo (0); }

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

@ מבחן ציבורי בטל כאשר מחיקת ספרים_ואז קטגוריות אמור להיות גם מחוקק () {bookRepository.deleteAll (); assertThat (bookRepository.count ()). isEqualTo (0); assertThat (categoryRepository.count ()). isEqualTo (2); }

אנו יכולים לשנות התנהגות זו על ידי שינוי מאפייני הקשר, כגון ה- CascadeType.

7. מסקנה

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

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


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