מפתחות עיקריים מורכבים ב- 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.


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