ה- DAO עם Spring and Hibernate

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

מאמר זה יראה כיצד ליישם את ה- DAO עם Spring and Hibernate. לקבלת תצורת הליבה של מצב שינה, עיין במאמר הקודם של שינה 5 עם אביב.

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

החל מאביב 3.0 ומצב שינה 3.0.1, האביב HibernateTemplate כבר לא נחוץ לנהל את מושב החורף. כעת ניתן להשתמש בפגישות הקשר - מושבים המנוהלים ישירות על ידי שינה ופעיל בכל היקף העסקה.

כתוצאה מכך, כיום נהוג להשתמש בממשק ה- API של Hibernate ישירות במקום ב- HibernateTemplate. זה למעשה ינתק את יישום שכבת ה- DAO מאביב לחלוטין.

2.1. תרגום חריג ללא HibernateTemplate

תרגום חריג היה אחד האחריות של HibernateTemplate - תרגום של חריגים במצב שינה נמוך ברמה נמוכה יותר, חריגים אביביים כלליים.

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

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

2.2. ניהול מושב שינה ללא התבנית

כאשר יצאה תמיכה במצב שינה במפגשים הקשריים, HibernateTemplate למעשה התיישן. למעשה, ה- Javadoc של הכיתה מדגיש כעת היבט זה (מודגש מהמקור):

הערה: החל מ- Hibernate 3.0.1, ניתן גם לקודד קוד גישה לעסקים ב- Hibernate בסגנון Hibernate רגיל. לפיכך, עבור פרויקטים שהתחילו לאחרונה, שקול לאמץ את הסגנון הסטנדרטי Hibernate3 של קידוד אובייקטים לגישה לנתונים במקום זאת, בהתבסס על {@link org.hibernate.SessionFactory # getCurrentSession ()}.

3. ה- DAO

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

שיעור מופשט ציבורי AbstractHibernateDAO {clazz Class private; @ SessionFactory פרטית אוטומטית sessionFactory; public void setClazz (Class clazzToSet) {clazz = clazzToSet; } ציבורי T findOne (id ארוך) {return (T) getCurrentSession (). get (clazz, id); } רשימה ציבורית findAll () {return getCurrentSession () .createQuery ("from" + clazz.getName ()) .list (); } שמירת ריקות ציבורית (ישות T) {getCurrentSession (). persist (ישות); } עדכון T ציבורי (ישות T) {החזר (T) getCurrentSession (). מיזוג (ישות); מחיקה בטלנית ציבורית (ישות T) {getCurrentSession (). מחיקה (ישות); } בטל ציבורי deleteById (מזהה ארוך) {ישות T סופית = findOne (id); מחק (ישות); } מושב סופי מוגן getCurrentSession () {return sessionFactory.getCurrentSession (); }}

כמה היבטים מעניינים כאן - כפי שנדון, ה- DAO המופשט אינו מרחיב שום תבנית אביב (כגון HibernateTemplate). במקום זאת, שינה SessionFactory מוזרק ישירות ל- DAO, ויהיה לו תפקיד ה- API הראשי של Hibernate, באמצעות ההקשר מוֹשָׁב זה חושף:

this.sessionFactory.getCurrentSession ();

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

עכשיו, בואו נסתכל על דוגמה ליישום של DAO זה, למשך פו יֵשׁוּת:

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

4. מסקנה

מאמר זה כיסה את התצורה וההטמעה של שכבת ההתמדה עם Hibernate ו- Spring.

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

את היישום של פרויקט פשוט זה ניתן למצוא בפרויקט github.


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