מבוא לנתוני האביב JPA

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

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

2. נתוני האביב שנוצרו DAO - אין יותר יישומי DAO

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

Spring Data לוקח את הפשט הזה צעד אחד קדימה ו מאפשר להסיר את יישומי DAO לחלוטין. הממשק של ה- DAO הוא כעת החפץ היחיד שעלינו להגדיר במפורש.

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

על ידי הרחבת הממשק אנו מקבלים את שיטות ה- CRUD הרלוונטיות ביותר לגישה לנתונים סטנדרטיים הקיימים ב- DAO רגיל.

3. שיטת גישה מותאמת אישית ושאלות

כפי שנדון, על ידי יישום אחד מה- מאגר ממשקים, ל- DAO כבר יוגדרו ויושמו כמה שיטות בסיסיות (ושאילתות) של CRUD.

כדי להגדיר שיטות גישה ספציפיות יותר, Spring JPA תומך בלא מעט אפשרויות:

  • בפשטות להגדיר שיטה חדשה בממשק
  • לספק את בפועל שאילתת JPQL באמצעות @שאילתא ביאור
  • השתמש במתקדמים יותר מפרט ותמיכה ב- Querydsl בנתוני האביב
  • לְהַגדִיר שאילתות מותאמות אישית באמצעות שאילתות בשם JPA

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

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

3.1. שאילתות מותאמות אישית אוטומטיות

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

בואו נסתכל על דוגמא: אם לישות יש שֵׁם שדה (ותקן Java Bean getName ו setName שיטות), נגדיר את findByName שיטה בממשק DAO; זה ייצור באופן אוטומטי את השאילתה הנכונה:

ממשק ציבורי IFooDAO מרחיב את JpaRepository {Foo findByName (שם מחרוזת); }

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

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

java.lang.IllegalArgumentException: לא נמצא שם נכס לסוג class com.baeldung.spring.data.persistence.model.Foo

3.2. שאילתות מותאמות אישית ידניות

בואו נסתכל על שאילתה מותאמת אישית אותה נגדיר דרך ה- @שאילתא ביאור:

@Query ("בחר F FOO F WHERE LOWER (f.name) = LOWER (: name)") Foo retrieveByName (@Param ("name") שם מחרוזת);

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

4. תצורת עסקה

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

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

4.1. תרגום חריג הוא חי וטוב

השאלה היא כעת - מכיוון ש- Spring Data JPA אינו תלוי בתבניות ה- ORM הישנות (JpaTemplate, HibernateTemplate) והם הוסרו מאז אביב 5 - האם אנחנו עדיין הולכים לתרגם את חריגי ה- JPA ל- Spring DataAccessException הִיֵרַרכִיָה?

ברור שאנחנו - תרגום חריג עדיין מופעל על ידי השימוש ב- מאגר @ ביאור על ה- DAO. ביאור זה מאפשר לאחר מעבד שעועית אביב לייעץ לכולם מאגר @ שעועית עם כל PersistenceExceptionTranslator מקרים שנמצאו במיכל, ומספקים תרגום חריג בדיוק כמו קודם.

בואו נאמת תרגום חריג באמצעות מבחן שילוב:

@Test (צפוי = DataIntegrityViolationException.class) חלל ציבורי givenFooHasNoName_whenInvalidEntityIsCreated_thenDataException () {service.create (new Foo ()); }

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

5. תצורת מאגר נתונים של JPA מאגר

כדי להפעיל את תמיכת מאגר JPA האביב נוכל להשתמש ב- @EnableJpaRepositories ביאור וציין את החבילה שמכילה את ממשקי DAO:

@EnableJpaRepositories (basePackages = "com.baeldung.spring.data.persistence.repository") מעמד ציבורי PersistenceConfig {...}

אנחנו יכולים לעשות את אותו הדבר עם תצורת XML:

6. תצורת Java או XML

כבר דנו בפירוט רב כיצד להגדיר את JPA באביב במאמר קודם. Spring Data גם מנצל את תמיכת Spring ב- JPA @PersistenceContext ביאור. הוא משתמש בזה כדי לחבר את EntityManager לתוך שעועית מפעל האביב האחראית ליצירת יישומי DAO בפועל - JpaRepositoryFactoryBean.

בנוסף לתצורה שנדונה כבר, עלינו לכלול את תצורת ה- XML ​​של Spring Data - אם אנו משתמשים ב- XML:

@Configuration @EnableTransactionManagement @ImportResource ("classpath *: * springDataConfig.xml") מחלקת הציבור PersistenceJPAConfig {...}

7. תלות במייבון

בנוסף לתצורת Maven עבור JPA, כמו במאמר קודם, נוסיף את ה- spring-data-jpa תלות:

 org.springframework.data spring-data-jpa 2.2.7.RELEASE 

8. שימוש במגף אביב

אנו יכולים גם להשתמש בתלות האביב של Starter Spring של JPA שתגדיר באופן אוטומטי את ה- מקור מידע בשבילנו.

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

 org.springframework.boot spring-boot-starter-data-jpa 2.2.6.RELEASE com.h2database h2 1.4.200 

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

התצורה המפורשת ליישום Spring סטנדרטי כלולה כעת כחלק מהתצורה האוטומטית של Spring Boot.

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

Spring Boot מספק דרך קלה לעשות זאת באמצעות מאפיינים ב- application.properties קוֹבֶץ:

spring.datasource.url = jdbc: h2: mem: db; DB_CLOSE_DELAY = -1 spring.datasource.username = sa spring.datasource.password = sa

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

9. מסקנה

מאמר זה כיסה את התצורה וההטמעה של שכבת ההתמדה באמצעות Spring 5, JPA 2 ו- Spring Data JPA (חלק מפרויקט הגג של Spring Data), תוך שימוש בתצורה מבוססת XML ו- Java.

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

את היישום של מדריך האביב הזה של JPA ניתן למצוא בפרויקט GitHub.