ה- 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, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.