מיירטים במצב שינה

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

בדיון זה נבחן דרכים שונות ליירוט פעולות ביישום מיפוי ההתייחסות המופשט של Hibernate.

2. הגדרת מיירטים במצב שינה

המיירט למצב שינה הוא ממשק המאפשר לנו להגיב לאירועים מסוימים בתוך מצב שינה.

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

ישנן שתי דרכים להגדרת מיירטים:

  1. יישום ה- org.hibernate. Interceptor מִמְשָׁק
  2. הרחבת ה- org.hibernate.EmptyInterceptor מעמד

2.1. יישום מיירט מִמְשָׁק

יישום org.hibernate. Interceptor דורש יישום של כ -14 שיטות נלוות. שיטות אלה כוללות onLoad, onSave, onDelete, findDirty, ועוד כמה.

חשוב גם לוודא כי כל מחלקה המיישמת ממשק Interceptor ניתנת לסידור ((מיישמת java.io.Serializable).

דוגמה טיפוסית תיראה כך:

מחלקה ציבורית CustomInterceptorImpl מיישם Interceptor, ניתן לסידור {@Override ציבורי בוליאני onLoad (ישות אובייקט, מזהה ניתן לסידור, אובייקט [] מצב, מחרוזת [] propertyNames, סוג [] סוגים) זורק CallbackException {// ... להחזיר false; } // ... @Override מחרוזת ציבורית onPrepareStatement (מחרוזת SQL) {// ... להחזיר SQL; }}

אם אין דרישות מיוחדות, הרחבת ה- EmptyInterceptor מומלץ רק לעקוף את השיטות הנדרשות.

2.2. מַאֲרִיך EmptyInterceptor

הרחבת ה- org.hibernate.EmptyInterceptor מחלקה מספקת דרך קלה יותר להגדרת מיירט. כעת עלינו לעקוף רק את השיטות המתייחסות לפעולה אותה אנו רוצים ליירט.

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

מחלקה ציבורית CustomInterceptor מרחיב את EmptyInterceptor {}

ואם עלינו ליירט פעולות שמירת נתונים לפני ביצוען, עלינו לעקוף onSave שיטה:

@Override ציבורי בוליאני onSave (ישות אובייקט, מזהה ניתן לסידור, מצב אובייקט [], מחרוזת [] propertyNames, סוג [] סוגי) {אם (ישות למשל של משתמש) {logger.info ((((משתמש) ישות). ; } להחזיר super.onSave (ישות, מזהה, מדינה, רכוש שמות, סוגים); }

שימו לב כיצד יישום זה פשוט מדפיס את הישות - אם היא א מִשׁתַמֵשׁ.

אמנם ניתן להחזיר ערך של נָכוֹן אוֹ שֶׁקֶרזה נוהג טוב לאפשר התפשטות של onSave אירוע על ידי הפעלת super.onSave ().

מקרה שימוש נוסף יהיה מתן מסלול ביקורת לאינטראקציות בין בסיסי נתונים. אנחנו יכולים להשתמש ב- onFlushDirty () שיטה לדעת מתי ישות משתנה.

בשביל ה מִשׁתַמֵשׁ אנו יכולים להחליט לעדכן אותו שונה לאחרונה מאפיין תאריך בכל פעם שמשתנה בגופים מהסוג מִשׁתַמֵשׁ לִקְרוֹת.

ניתן להשיג זאת באמצעות:

@Override בוליאני ציבורי onFlushDirty (ישות אובייקט, מזהה ניתן לסידור, אובייקט [] currentState, Object [] previousState, String [] propertyNames, Type [] types) {if (entity entity of User) {((User) entity) .setLastModified (new תַאֲרִיך()); logger.info (((משתמש) ישות). toString ()); } להחזיר super.onFlushDirty (ישות, מזהה, currentState, previousState, propertyNames, types); }

אירועים אחרים כגון לִמְחוֹק ו לִטעוֹן (אתחול אובייקט) ניתן ליירט על ידי יישום המקביל on מחק ו onLoad שיטות בהתאמה.

3. רישום מיירטים

ניתן לרשום מיירט תרדמת שינה כ- מוֹשָׁב-מגובה או SessionFactory-scoped.

3.1. מיירט בהיקף מושב

א מוֹשָׁבמיירט מגודר מקושר לפגישה ספציפית. זה נוצר כאשר ההגדרה מוגדרת או נפתחת כ:

מושב סטטי ציבורי getSessionWithInterceptor (מיירט מיירט) זורק IOException {להחזיר getSessionFactory (). עם אופציות (). מיירט (מיירט) .openSession (); }

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

3.2. SessionFactory-מגובה מיירט

א SessionFactory-מיירט היקף רשום לפני בניית א SessionFactory. זה נעשה בדרך כלל דרך החל Interceptor שיטה על א SessionFactoryBuilder למשל:

ServiceRegistry serviceRegistry = configureServiceRegistry (); SessionFactory sessionFactory = getSessionFactoryBuilder (serviceRegistry) .applyInterceptor (CustomInterceptor חדש ()) .build ();

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

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

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

hibernate.current_session_context_class = org.hibernate.context.internal.ThreadLocalSessionContext

או על ידי הוספת זה לקובץ התצורה של ה- XML ​​שלנו:

 org.hibernate.context.internal.ThreadLocalSessionContext 

כמו כן, כדי להבטיח סדרתיות, SessionFactoryמיירטים מגובשים חייבים ליישם את קרא פתרון שיטת ה- ניתן לבצע סדרתי מִמְשָׁק.

4. מסקנה

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

אלטרנטיבות אחרות למיירטים כוללות אירועי שינה ו- JPA Callbacks.

וכמו תמיד, תוכלו לבדוק את קוד המקור השלם ב- Github.


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