JPA @ Embedded ו- @ Embeddable

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

במדריך זה נראה כיצד אנו יכולים למפות ישות אחת המכילה מאפיינים משובצים לטבלת מסד נתונים אחת.

לכן, למטרה זו, נשתמש ב- @ ניתן להטמיעה ו @ משובץ ביאורים המסופקים על ידי API ל- Persistence Java (JPA).

2. הקשר מודל נתונים

ראשית, נגדיר טבלה בשם חֶברָה.

ה חֶברָה הטבלה תאחסן מידע בסיסי כגון שם החברה, כתובת וטלפון, כמו גם מידע של איש קשר:

חברה ממעמד ציבורי {מזהה שלם פרטי; שם מחרוזת פרטי; כתובת מחרוזת פרטית; טלפון מחרוזת פרטי; פרטי מחרוזת contactFirstName; פרטי מחרוזת contactLastName; פרטי מחרוזת contactPhone; // גטרים סטנדרטיים, סטרים}

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

3. @ ניתן להטמיעה

JPA מספקת את @ ניתן להטמיעה ביאור להצהרה כי כיתה תוטמע על ידי ישויות אחרות.

בואו נגדיר כיתה שתפשט את פרטי איש הקשר:

@ Embeddable class public ContactPerson {שם פרטי פרטי מחרוזת; שם משפחה פרטי מחרוזת; טלפון מחרוזת פרטי; // גטרים סטנדרטיים, סטרים}

4. @ משובץ

ההערה ל- JPA @ משובץ משמש להטמעת סוג לישות אחרת.

בואו ונשנה את שלנו חֶברָה מעמד. נוסיף את ההערות של JPA ונעבור גם לשימוש איש קשר במקום שדות נפרדים:

חברת מחלקה ציבורית @Entity {@Id @GeneratedValue מזהה פרטי שלם; שם מחרוזת פרטי; כתובת מחרוזת פרטית; טלפון מחרוזת פרטי; @ ContactPerson פרטי משובץ contactPerson; // גטרים סטנדרטיים, סטרים}

כתוצאה מכך יש לנו את היישות שלנו חֶברָה, הטמעת פרטי איש קשר ומיפוי לטבלת בסיס נתונים אחת.

עדיין יש לנו בעיה אחת נוספת והיא כיצד JPA תמפה שדות אלה לעמודות מסד נתונים.

5. תכונות מבטלות

העניין הוא שהשדות שלנו נקראו דברים כמו contactFirstName במקור שלנו חֶברָה בכיתה ועכשיו שם פרטי בשלנו איש קשר מעמד. לכן, JPA תרצה למפות את אלה אל איש קשר_שם ראשון ו שם פרטי, בהתאמה.

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

אז נוכל להשתמש @ AttributeOverrides ו @AttibuteOverride כדי לעקוף את מאפייני העמודות מהסוג המוטמע שלנו.

בואו נוסיף את זה ל איש קשר שדה שלנו חֶברָה יֵשׁוּת:

@ Embedded @ AttributeOverrides ({@ AttributeOverride (name = "firstName", column = @Column (name = "contact_first_name")), @ AttributeOverride (name = "lastName", column = @Column (name = "contact_last_name")), @AttributeOverride (name = "phone", column = @Column (name = "contact_phone"))}) פרטי ContactPerson contactPerson;

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

6. מסקנה

במדריך זה הגדרנו ישות עם כמה תכונות משובצות ומיפנו אותן לאותה טבלת מסד נתונים כמו הישות הסוגרת. לשם כך השתמשנו ב- @ משובץ, @ ניתן להטמיעה, @ AttributeOverrides ו @ AttributeOverride הערות המסופקות על ידי ממשק ה- API של Java Persistence.

כמו תמיד, קוד המקור של הדוגמה זמין ב- GitHub.