הצהרת INSERT ב- JPA

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

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

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

2. אובייקטים מתמידים ב- JPA

ב- JPA, כל ישות שעוברת ממצב חולף למנוהל מטופלת באופן אוטומטי על ידי ה- EntityManager.

ה EntityManager בודק אם ישות נתונה כבר קיימת ואז מחליט אם יש להוסיף אותה או לעדכן אותה. בגלל הניהול האוטומטי הזה, tהוא רק הצהרות המותרות על ידי JPA הן SELECT, UPDATE ו- לִמְחוֹק.

בדוגמאות שלהלן נבחן דרכים שונות לניהול ומעקף מגבלה זו.

3. הגדרת מודל משותף

עכשיו נתחיל בהגדרת ישות פשוטה בה נשתמש במהלך הדרכה זו:

אדם בכיתה ציבורית @Entity {@Id פרטי מזהה ארוך; פרטי מחרוזת firstName; שם משפחה פרטי מחרוזת; // גטרים וקובעים סטנדרטיים, בוני ברירת מחדל ו- all-args}

בנוסף, בואו נגדיר מחלקת מאגר בה נשתמש ליישומים שלנו:

@ מאגר ציבורי אישי PersonInsertRepository {@PersistenceContext פרטי EntityManager entityManager; }

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

4. createNativeQuery

עבור שאילתות שנוצרו ידנית, אנו יכולים להשתמש ב- EntityManager # createNativeQuery שיטה. זה מאפשר לנו ליצור כל סוג של שאילתת SQL, לא רק כאלה הנתמכים על ידי JPA. בואו נוסיף שיטה חדשה למחלקת המאגר שלנו:

@ Transactional void void insertWithQuery (אדם אדם) {entityManager.createNativeQuery ("הכנס לאדם (id, שם פרטי, שם משפחה) VALUES (?,?,?)"). SetParameter (1, person.getId ()). SetParameter (2 , person.getFirstName ()) .setParameter (3, person.getLastName ()) .executeUpdate (); }

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

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

@ מבחן פומבי בטל שניתןPersonEntity_whenInsertedTwiceWithNativeQuery_thenPersistenceExceptionExceptionIsTrowne () {אדם אדם = אדם חדש (1 ליטר, "שם פרטי", "שם משפחה"); assertThatExceptionOfType (PersistenceException.class) .isTrowneBy (() -> {personInsertRepository.insertWithQuery (PERSON); personInsertRepository.insertWithQuery (PERSON);}); }

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

העיקרון כאן זהה אם אנו משתמשים ב- Spring Data @שאילתא.

5. להתמיד

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

במקום זאת, אנו יכולים לעשות שימוש ב- להתמיד שיטה מ EntityManager.

כמו בדוגמה הקודמת שלנו, בואו נרחיב את מחלקת המאגר שלנו בשיטה מותאמת אישית:

@ Transactional בטל ציבורי insertWithEntityManager (אדם אישי) {this.entityManager.persist (אדם); }

כעת נוכל לבדוק שוב את גישתנו:

הציבור @Test ומבוטל givenPersonEntity_whenInsertedTwiceWithEntityManager_thenEntityExistsExceptionIsThrown () {assertThatExceptionOfType (EntityExistsException.class) .isThrownBy (() -> {personInsertRepository.insertWithEntityManager (אדם חדש (1L, "שם פרטי", "השם המשפחה")); personInsertRepository.insertWithEntityManager (אדם חדש (1 ליטר, "שם פרטי שם משפחה")); }); }

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

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

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

6. מסקנה

במאמר זה המחשנו דרכים לבצע פעולות הכנסה באובייקטים של JPA. בדקנו דוגמאות לשימוש בשאילתה מקורית וכן בשימוש EntityManager # נמשכת כדי ליצור הצהרות INSERT מותאמות אישית.

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


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