מפתחות עיקריים מורכבים ב- JPA
1. הקדמה
במדריך זה נלמד על מפתחות ראשיים מרוכבים וההערות המתאימות ב- JPA.
2. מפתחות ראשי מורכבים
מפתח ראשי מורכב - הנקרא גם מפתח מורכב - הוא שילוב של שתי עמודות או יותר כדי ליצור מפתח ראשי לטבלה.
ב- JPA יש לנו שתי אפשרויות להגדרת המקשים המורכבים: @IdClass ו @ EmbeddedId ביאורים.
על מנת להגדיר את המפתחות הראשיים המורכבים, עלינו לעקוב אחר כמה כללים:
- מחלקת המפתח העיקרית המורכבת חייבת להיות ציבורית
- זה חייב להיות בעל קונסטרוקטור ללא ארגון
- עליו להגדיר שווים() ו hashCode () שיטות
- זה חייב להיות סניתן למחיקה
3. ה IdClass ביאור
נניח שיש לנו שולחן שנקרא חֶשְׁבּוֹן ויש לו שתי עמודות - חשבון מספר, חשבון סוג - המהווים את המפתח המורכב. עכשיו אנחנו צריכים למפות את זה ב- JPA.
בהתאם למפרט JPA, בואו ליצור מזהה חשבון בכיתה עם שדות המפתח העיקריים הבאים:
מחלקה ציבורית AccountId מיישמת Serializable {private String accountNumber; חשבון מחרוזת פרטי סוג; // בונה ברירת מחדל AccountId (String accountNumber, String accountType) {this.accountNumber = accountNumber; this.accountType = accountType; } // שווה ל- () ו- hashCode ()}
הבא, בואו נקשר את ה- מזהה חשבון מחלקה עם הישות חֶשְׁבּוֹן.
על מנת לעשות זאת, עלינו להוסיף הערות לישות עם ה- @IdClass ביאור. עלינו להכריז גם על השדות מה- מזהה חשבון מחלקה ביישות חֶשְׁבּוֹן וביאור להם עם @תְעוּדַת זֶהוּת:
@Entity @IdClass (AccountId.class) חשבון בכיתה ציבורית {@Id פרטי מחרוזת חשבון מספר; @Id פרטי מחרוזת accountType; // שדות אחרים, גטרים וקובעים}
4. ה EmbeddedId ביאור
@ EmbeddedId מהווה אלטרנטיבה ל @IdClass ביאור.
בואו ניקח בחשבון דוגמה נוספת שבה עלינו להתמיד במידע של א סֵפֶר עם כותרת ו שפה כשדות המפתח העיקריים.
במקרה זה, מחלקת המפתח העיקרית, BookId, חייב להיות ביאור עם @ ניתן להטמיעה:
@ Embeddable class class BookId מיישמת בכותרת {כותרת מחרוזת פרטית; שפת מחרוזת פרטית; // בונה ברירת מחדל ציבורית BookId (כותרת מחרוזת, שפת מחרוזת) {this.title = title; שפה זו = שפה; } // שיטות getters, שווה () ו- hashCode ()}
לאחר מכן, עלינו לשבץ את המעמד הזה ב בגם ישות המשתמשת @ EmbeddedId:
ספר בכיתה ציבורית @Entity {@EmbeddedId BookId bookId פרטי; // בונים, שדות אחרים, גטרים וקובעים}
5. @IdClass לעומת @ EmbeddedId
כפי שראינו זה עתה, ההבדל על פני השטח בין שני אלה הוא זה עם @IdClassהיינו צריכים לציין את העמודות פעמיים - פעם אחת בתוך מזהה חשבון ושוב ב חֶשְׁבּוֹן. אבל עם @ EmbeddedId אנחנו לא.
יש כמה פשרות אחרות.
לדוגמה, מבנים שונים אלה משפיעים על שאילתות JPQL שאנו כותבים.
לדוגמא, עם @IdClass, השאילתה קצת יותר פשוטה:
בחר חשבון.accountNumber מחשבון חשבון
עם @ EmbeddedId, עלינו לעשות מעבר אחד נוסף:
בחר book.bookId.title FROM ספר ספר
גַם, @IdClass יכול להיות די שימושי במקומות שבהם אנחנומשתמשים בכיתת מפתח מורכבת שלא נוכל לשנות.
לבסוף, אם ניגש לחלקים במפתח המורכב בנפרד, נוכל להשתמש בו @IdClass, אבל במקומות שבהם אנו משתמשים לעתים קרובות במזהה השלם כאובייקט, @ EmbeddedId מועדף.
6. מסקנה
במאמר מהיר זה, אנו חוקרים מפתחות עיקריים מורכבים ב- JPA.
כמו תמיד, ניתן למצוא את הקוד השלם למאמר זה ב- Github.