ה- DAO עם JPA ו- Spring

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

מאמר זה יראה כיצד ליישם את ה- DAO עם Spring ו- JPA. לתצורת הליבה של JPA, עיין במאמר על JPA עם Spring.

2. אין עוד תבניות אביב

החל באביב 3.1, JpaTemplate ואת המקביל JpaDaoSupportהיה הוצא משימוש לטובת השימוש ב- API המקורי של Java Persistence.

כמו כן, שני השיעורים הללו רלוונטיים רק ל- JPA 1 (מה- JpaTemplate javadoc):

שים לב כי מחלקה זו לא שודרגה ל- JPA 2.0 ולעולם לא תעשה זאת.

כתוצאה מכך, כיום נהוג לעשות זאת השתמש ישירות בממשק ה- API של Java Persistence במקום ה JpaTemplate.

2.1. תרגום חריג ללא התבנית

אחת האחריות של JpaTemplate היה תרגום חריג - תרגום החריגים ברמה הנמוכה לרמה הגבוהה יותר, חריגים אביביים כלליים.

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

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

3. ה- DAO

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

שיעור מופשט ציבורי תקציר JpaDAO {קלאס כיתתי פרטי; @PersistenceContext EntityManager entityManager; public final void setClazz (Class clazzToSet) {this.clazz = clazzToSet; } find Tone ציבורי (מזהה ארוך) {return entityManager.find (clazz, id); } רשימה ציבורית findAll () {return entityManager.createQuery ("from" + clazz.getName ()) .getResultList (); } יצירת חלל ציבורי (ישות T) {entityManager.persist (ישות); } עדכון T ציבורי (T ישות) {return entityManager.merge (ישות); } מחיקת ריק ריק (ישות T) {entityManager.remove (ישות); } public void deleteById (long entityId) {T entity = findOne (entityId); מחק (ישות); }}

ההיבט המעניין העיקרי כאן הוא הדרך ה EntityManager מוזרק - באמצעות התקן @PersistenceContext ביאור. מתחת למכסה המנוע, זה מטופל על ידי PersistenceAnnotationBeanPostProcessor - שמעבד את ההערה, שולף את מנהל הישות JPA מהמכיל ומזריק אותה.

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

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

המחלקה הציבורית @ מאגר FooDAO מרחיבה את AbstractJPADAO מיישמת IFooDAO {public FooDAO () {setClazz (Foo.class); }}

4. מסקנה

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

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