Java מתקדם | JPA

‫קורס ‪ Java‬מתקדם‬
‫‪JPA‬‬
‫קרן כליף‬
‫‪ Java‬מתקדם |‬
‫‪2 | ©Keren Kalif |JPA‬‬
‫ביחידה זו נלמד‪:‬‬
‫‪ ‬מהו ‪JPA‬‬
‫‪ ‬יצירת אובייקטים וטבלאות באמצעות ‪JPA‬‬
‫‪ ‬עדכון רשומות ב‪DB -‬‬
‫‪ ‬שאילתות מה‪JPQL :DB -‬‬
‫‪ Java‬מתקדם |‬
‫‪3 | ©Keren Kalif |JPA‬‬
‫מהו ‪?JPA‬‬
‫‪ API – Java Persistence API ‬המגדיר עבודה מול ‪DB‬‬
‫‪ ‬זהו ממשק המגדיר ישויות (‪ )Entity‬שכל אחת באופן אוטומטי יוצרת טבלה ב‪DB -‬‬
‫‪o‬‬
‫כלומר‪ ,‬ה‪ DB -‬נוצר באמצעות ‪ annotation‬בשפת ‪ JAVA‬תוך כדי ריצה‬
‫‪ ‬ישנם כל מיני מימושים ל‪ ,JPA -‬למשל ‪eclipseLink, hibernate‬‬
‫‪ Java‬מתקדם |‬
‫‪4 | ©Keren Kalif |JPA‬‬
‫יצירת פרוייקט‬
‫ולכן צריך שה‪ tomcat -‬ירוץ‪,‬‬
‫ובהמשך גם ה‪ service -‬של ה‪sql -‬‬
‫‪ Java‬מתקדם |‬
‫‪5 | ©Keren Kalif |JPA‬‬
‫הגדרת החיבור ל‪DB -‬‬
‫להוסיף את ה‪ jar -‬המכיל את ה‪-‬‬
‫‪ driver‬של ה‪ SQL -‬לפרוייקט‬
‫‪ Java‬מתקדם |‬
‫‪6 | ©Keren Kalif |JPA‬‬
‫יצירת ‪JPA Entity‬‬
‫‪ JPA Entity ‬היא מחלקה שמנגנון ה‪JPA -‬‬
‫יודע לייצר עבורה טבלה בבסיס הנתונים‬
‫‪ ‬זוהי מחלקה רגילה עם סימון של ‪annotation‬‬
‫‪ Java‬מתקדם |‬
‫‪7 | ©Keren Kalif |JPA‬‬
‫יצירת ‪JPA Entity‬‬
‫סימון ששדה זה הוא‬
‫מפתח לטבלה‬
‫הוספת השדות למחלקה‬
‫‪ Java‬מתקדם |‬
‫‪8 | ©Keren Kalif |JPA‬‬
‫התוצר‬
‫ציון שזוהי מחלקה שתהייה עבורה טבלה ב‪DB -‬‬
‫נוצרת מחלקה שיש לה ‪( default c’tor‬ריק)‬
‫ומתודות ‪ set‬לכל התכונות‪ .‬כך המנגנון יודע‬
‫להפעיל את המתודות המתאימות על מנת‬
‫למלא את ערכי התכונות‪.‬‬
9 | ©Keren Kalif |JPA
windows  preferences
| ‫ מתקדם‬Java
..‫ואם מקבלים את השגיאה‬
:‫ עבור השגיאה‬
"The XXX cannot be resolved"
‫‪ Java‬מתקדם |‬
‫‪10 | ©Keren Kalif |JPA‬‬
‫דוגמת שימוש‬
‫שם הרכיב המכיל את אוסף המחלקות‬
‫שנתמוך עבורן ב‪.persistency -‬‬
‫מוגדר בקובץ ‪persistence.xml‬‬
‫לשמירת האובייקט ‪ d1‬ב‪DB -‬‬
‫נשים לב שלא הגדרנו בשום מקום‬
‫את הגדרות החיבור ל‪..DB -‬‬
11 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
persistence.xml ‫הקובץ‬
DB -‫ מגדיר את הגדרות החיבור ל‬
META-INF ‫ נמצא בתיקייה‬
‫‪ Java‬מתקדם |‬
‫‪12 | ©Keren Kalif |JPA‬‬
‫תוצר ההרצה‬
‫‪ ‬במידה ולא הייתה קיימת הטבלה ‪ dog‬ב‪ DB -‬היא נוצרה כך שכל שדה במחלקה הינו עמודה‬
‫בטבלה‬
‫‪ ‬וכן נוספה לטבלה שורה עם נתוני האובייקט שיצרנו בתוכנית‬
‫‪ Java‬מתקדם |‬
‫‪13 | ©Keren Kalif |JPA‬‬
‫ניתן להחליט ששדה המפתח ינתן אוטומטית‬
‫יצרנו אובייקט מבלי לעדכן‬
‫עבורו את שדה ה‪id -‬‬
‫‪ Java‬מתקדם |‬
‫‪14 | ©Keren Kalif |JPA‬‬
‫קביעת שם העמודה בטבלה‬
‫ציון ששדה זה יהיה עמודה בטבלה‪,‬‬
‫ניתן גם ללא ‪ annotation‬זה‬
‫ציון ששדה זה יהיה עמודה‬
‫בטבלה עם השם שצויין‬
15 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
‫חיפוש רשומה‬
‫‪ Java‬מתקדם |‬
‫‪16 | ©Keren Kalif |JPA‬‬
‫עדכון רשומה‬
‫העדכון יבוצע בין ה‪-‬‬
‫‪ begin‬ל‪commit -‬‬
17 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
‫מחיקת רשומה‬
‫‪ Java‬מתקדם |‬
‫‪18 | ©Keren Kalif |JPA‬‬
‫אובייקט מוכל‬
‫משמע לא תיווצר טבלה למחלקה זו‪ ,‬ושדותיה‬
‫ישמרו בטבלה של האובייקט המכיל‬
‫‪ Java‬מתקדם |‬
‫‪19 | ©Keren Kalif |JPA‬‬
‫אובייקט מכיל‬
‫שדות האובייקט המוכל ישמרו‬
‫בטבלאת האובייקט המכיל‬
20 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
student ‫ניתן לראות בטבלה‬
Address ‫את שדות‬
‫‪ Java‬מתקדם |‬
‫‪21 | ©Keren Kalif |JPA‬‬
‫‪@OneToOne‬‬
‫במקרה זה ישמר בטבלאת ‪ person‬רק‬
‫המפתח הראשי של ה‪Address -‬‬
‫נשים לב שמקרה כזה המחלקה ‪ Address‬צריכה להיות‬
‫מסומנת ב‪ @Entity -‬ולא ב‪@Embeddable -‬‬
22 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
‫ הטבלאות‬- @OneToOne
23 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
@OneToMany
24 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
@OneToMany
‫‪ Java‬מתקדם |‬
‫‪25 | ©Keren Kalif |JPA‬‬
‫‪ - @OneToMany‬התוצרים‬
‫טבלאת הקשר נוצרה באופן אוטומטי!‬
‫ובאופן דומה ניתן להשתמש גם ב‪-‬‬
‫‪ @ManyToOne‬וב‪@ManyToMany -‬‬
‫‪ Java‬מתקדם |‬
‫‪26 | ©Keren Kalif |JPA‬‬
‫שאילתות‬
‫‪ ‬ישנם ‪ 2‬סוגים של שאילתות‪:‬‬
‫‪o‬‬
‫‪o‬‬
‫‪ – static queries‬שאילתות קבועות‪ ,‬ללא פרמטרים‬
‫‪ – dynamic queries‬שאילתות המקבלות פרמטרים‬
‫‪ ‬ישנם ‪ 2‬מנגנונים לשאילתות ב‪:JPA -‬‬
‫‪JPQL – Java Persistence Query‬‬
‫‪.1‬‬
‫•‬
‫‪.2‬‬
‫שפת שאילתות הדומה ל‪ SQL -‬ומבוססת על סכימת הישויות והקשרים בינהן‬
‫‪Criteria Query‬‬
‫‪ Java‬מתקדם |‬
‫‪27 | ©Keren Kalif |JPA‬‬
‫‪JPQL – Java Persistence Query Language‬‬
‫‪ ‬ישנן ‪ 2‬דרכים להפעלת השאילתות‪:‬‬
‫‪.1‬‬
‫‪ – createQuery‬הגדרת השאילתא בתוך המתודות‪ ,‬לרוב עבור שאילתות דינאמיות‬
‫‪.2‬‬
‫‪ – createNameQuery‬הגדרת מאפייני השאילתא כתכונה במחלקה ושימוש בהמשך‪ ,‬לרוב עבור‬
‫שאילתות סטטיות‬
28 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
:NamedQuery ‫הגדרת‬
@Entity -‫מתחת ל‬
29 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
NamedQuery -‫שימוש ב‬
Query -‫שימוש ב‬
30 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
‫ הגדרה‬- Positional Parameters
"?" ‫לפני מספר הפרמטר יבוא‬
31 | ©Keren Kalif |JPA
| ‫ מתקדם‬Java
‫ שימוש‬- Positional Parameters
‫‪ Java‬מתקדם |‬
‫‪32 | ©Keren Kalif |JPA‬‬
‫יצירת המחלקות מה‪DB -‬‬
‫‪ ‬בהינתן ‪ ,DB‬ניתן לייצר את התהליך ההפוך ולקבל את המחלקות‪:‬‬
‫‪New  Jpa Entities from Tables‬‬
‫‪ Java‬מתקדם |‬
‫‪33 | ©Keren Kalif |JPA‬‬
‫ביחידה זו למדנו‪:‬‬
‫‪ ‬מהו ‪JPA‬‬
‫‪ ‬יצירת אובייקטים וטבלאות באמצעות ‪JPA‬‬
‫‪ ‬עדכון רשומות ב‪DB -‬‬
‫‪ ‬שאילתות מה‪JPQL :DB -‬‬