ההבדל בין JPA, Hibernate ו- EclipseLink

1. הקדמה

במדריך זה נדון ב- Hibernate וב- Java Persistence API (JPA) - תוך התמקדות בהבדלים ביניהם.

נו התחל בלבדוק מהו JPA, כיצד משתמשים בו ומושגי הליבה מאחורי זה.

לאחר מכן, נבחן כיצד Hibernate ו- EclipseLink משתלבים בתמונה.

2. מיפוי יחסי אובייקט

לפני שנצלול ל- JPA, חשוב להבין את המושג מיפוי-אובייקט-אובייקט - המכונה גם ORM.

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

3. מבוא ל- JPA

ה- API של התמדה של Java, או JPA, הוא מפרט המגדיר ניהול נתונים יחסיים ביישום Java. ה- API ממפה קבוצה של מושגים המגדירים אילו אובייקטים יש ליישם באפליקציה, וכיצד הוא אמור להתמיד בהם.

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

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

3.1. יֵשׁוּת

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

בנוסף, על כל הגופים שנבחרו להגדיר מפתח ראשי המסומן על ידי @תְעוּדַת זֶהוּת ביאור. ביחד עם ה @ GeneratedValue הערה, אנו מגדירים כי המפתח הראשי צריך להיווצר באופן אוטומטי כאשר הרשומה נמשכת למסד הנתונים.

בואו נסתכל על דוגמה מהירה ליישות שתוארה על ידי JPA.

מכונית ציבורית @Entity {@GeneratedValue @ Id מזהה ציבורי ארוך; // גטרים וקובעים} 

זכור, כרגע זה לא ישפיע על היישום - JPA לא מספקת קוד יישום.

3.2. התמדה בשטח

מושג ליבה נוסף של JPA הוא התמדה בשטח. כאשר אובייקט ב- Java מוגדר כישות, כל השדות בתוכו נשמרים אוטומטית כעמודות שונות בטבלת הישויות.

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

3.3. יחסים

הַבָּא, JPA מציין כיצד עלינו לנהל קשרים בין טבלאות בסיס שונות במסגרת היישום שלנו. כפי שראינו, JPA מטפל בזה בהערות. ישנן ארבע הערות יחסים שעלינו לזכור:

  1. @אחד לאחד
  2. @אחד לרבים
  3. @ManyToOne
  4. @ManyToMany

בואו נסתכל איך זה עובד:

@Entity בכיתה ציבורית SteeringWheel {@OneToOne רכב פרטי פרטי // גטררים וקובעים}

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

3.4. מנהל ישויות

סוף - סוף, ה מחלקה javax.persistence.EntityManager מציין פעולות למסד הנתונים וממנו. ה EntityManager מכיל פעולות נפוצות של יצירה, קריאה, עדכון ומחיקה (CRUD) הנמשכים למסד הנתונים.

4. יישומי JPA

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

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

  1. בגרות הפרויקט - כמה זמן הספק קיים, וכמה זה מתועד היטב?
  2. תתי-פרוייקטים - האם לספק יש תכניות משנה שימושיות כלשהן ליישום החדש שלנו?
  3. תמיכה בקהילה - האם יש מישהו שיעזור לנו כשאנחנו בסופו של דבר עם באג קריטי?
  4. מידוד - כמה ביצועים האם היישום?

אמנם לא נעמיק בנושא ביצוע המבחן של ספקי JPA שונים, אולם ה- JPA Performance Benchmark (JPAB) מכיל תובנות בעלות ערך רב לכך.

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

5. שינה

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

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

בואו נסתכל במהירות על מה שמציע שינה עם ה- @יֵשׁוּת ביאור.

תוך מילוי חוזה JPA, @ org.hibernate.annotations.Entity מוסיף מטא נתונים נוספים החורגים ממפרט ה- JPA. פעולה זו מאפשרת להתאים את ההתמדה בישות. לדוגמה, בואו נסתכל על כמה הערות שמציעה Hibernate שמרחיבות את הפונקציונליות של @יֵשׁוּת:

  1. @שולחן מאפשר לנו ציין את שם הטבלה נוצר עבור הישות
  2. @BatchSizeמציין את גודל אצווה בעת אחזור הזכאותמהשולחן

ראוי לציין גם כמה מהתכונות הנוספות ש- JPA לא מציין, שעשויות להיות שימושיות ביישומים גדולים יותר:

  1. הצהרות CRUD הניתנות להתאמה אישית עם @SQLInsert, @SQLUpate ו- @SQLDelete ביאורים
  2. תמיכה למחיקה רכה
  3. ישויות בלתי ניתנות לשינוי עם @בלתי ניתן לשינוי ביאור

לצלילה עמוקה יותר למצב שינה והתמדה ב- Java - עבור לסדרת הדרכות ההתמדה באביב.

6. EclipseLink

EclipseLink, שנבנה על ידי קרן Eclipse, מספק יישום JPA ממקור פתוח. בנוסף, EclipseLink תומך במספר תקני התמדה אחרים כגון Java Architecture for XML Binding (JAXB).

במילים פשוטות, במקום להתמיד באובייקט בשורת מסד נתונים, JAXB ממפה אותו לייצוג XML.

לאחר מכן, על ידי השוואה בין אותו הדבר @יֵשׁוּת יישום הערות, אנו רואים כי EclipseLink מציע שוב הרחבות שונות. אמנם אין ביאור ל- @BatchSize כפי שראינו קודם, EclipseLink מציע אפשרויות אחרות ש- Hibernate לא מציע.

לדוגמה:

  1. @ReadOnly - מציין שהישות שיש לנהל אותה היא לקריאה בלבד
  2. @מבנה - מגדיר את הכיתה למיפוי לסוג 'מבנה' של מסד נתונים

כדי לקרוא עוד על מה שיש ל- EclipseLink להציע, עבור אל המדריך שלנו ב- EclipseLink עם Spring.

7. מסקנה

במאמר זה הסתכל ב- API של התמדה של Java, או JPA.

לבסוף, חקרנו איך זה שונה מ- Hibernate ו- EclipseLink.