ORM, JPA, Hibernate and GORM

 בסוגים מסוימים של אפליקציות אחד ממרכיבי הפיתוח העיקריים הוא העבודה מול בסיס נתונים יחסי (RDBMS).

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

באופן פרקטי כמובן שלא נרצה לראות קטעי SQL זרוקים בכל הקוד שלנו, ולכן קיימות תבניות כגון DAO/DAL  וכן תשתיות (כגון iBatis) שמטרתן לכמס (encapsulate) את הגישה לבסיס הנתונים, ולחסוך קוד חוזר (boilerplate) במיפוי בין אובייקטים לרשומות בבסיס הנתונים.

OR Impedance mismatch

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

הבדלים במודל

דוגמא 1 – בעולם של אובייקטים כיוון המצביעים יהיה באופן טבעי מלמעלה למטה. למשל אם יש ללקוח רשימת טלפונים, נקבל סמנטיקה בסגנון customer.getPhoneNumbers(). בבסיס הנתונים הייצוג הוא הפוך – בכל רשומה של PHONE_NUMBER יופיע מצביע (מפתח זר) ללקוח אליו הוא שייך.

דוגמא 2 – בעולם האובייקטים ניתן להגדיר ירושה. זה מושג שאין לו מקבילה בעולם הרלציוני (במסגרת מודל E/R הסטנדרטי).

הבדלי זהות

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

הבדלי סנכרון וגבולות טרנזקציה

במודל הזיכרון של ג'אווה – כל שינוי או השמה של ערך משתקף מיד באובייקט. לעומת זאת מושג הטרנזקציה לא קיים (זו הצגה קצת פשטנית אך מתאימה לצורך ההמחשה). סנכרון מצב האובייקט עם בסיס הנתונים דורש פעולה אקטיבית מול בסיס הנתונים במסגרת טרנזקציה.

זה על קצה המזלג. מי שמתעניין מוזמן לקרוא עוד על  Object Relational Impedance mismatch.

ORM

Object Relational mapping הן תשתיות שפותחו על מנת לספק מיפוי בין המודל הרלציוני למודל האובייקטים בצורה שקופה, ולצמצם את הפער בין המודלים.

הפרויקט המפורסם ביותר בתחום בעולם הג'אווה הוא hibernate (זמין גם לפלטפורמת .NET כמו כן עם ממשק מעט שונה יכול לשמש מימוש של JPA – הארכיטקטורה הסטנדרטית של ג'אווה).

הרעיון הוא למפות אובייקטים לטבלאות בבסיס הנתונים, כולל ירושה, תלויות בין אובייקטים וכו', ולאחר מכן לעבוד איתם באופן (כמעט) טבעי, כאשר התשתית דואגת למיפוי מול בסיס הנתונים באופן שקוף, החל מבניית הסכימה המתאימה בבסיס הנתונים אם יש צורך ועד לשליפה, עדכון ואחסון של הנתונים. (מעניין לציין שפלטפורמת rails נוהגת באופן הפוך – קודם יוצרים את הסכימה והתשתית מחוללת את המחלקות המתאימות). Grails עושה שימוש בתשתית שנקראת GORM שלמעשה מבוססת על hibernate.

To ORM or not to ORM?

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

בפוסט הבא אני אדגים שימוש בשלוש תכונות של GORM – ירושה, סנכרון לבסיס הנתונים וsecond level cache.

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s