

ספריות ותקנים
52. מה זה Hibernate? מה ההבדל בין JPA לבין Hibernate?
כדי לענות על השאלה הזו, אני חושב שאנחנו צריכים קודם כל להבין מה זה JPA. זהו מפרט המתאר מיפוי יחסי אובייקט של אובייקטי Java פשוטים ומספק API לאחסון, אחזור ותפעול אובייקטים כאלה. כלומר, מסדי נתונים יחסיים (DBs) מיוצגים כקבוצה של טבלאות מחוברות. ו-JPA הוא תקן מאומץ נרחב שמתאר כיצד אובייקטים יכולים לקיים אינטראקציה עם מסדי נתונים יחסיים. כפי שאתה יכול לראות, JPA הוא משהו מופשט ובלתי מוחשי. זה כמו הרעיון עצמו, הגישה.
53. מה זה מדורג? איך משתמשים בו במצב Hibernate?
כפי שאמרתי קודם, תקשורת במצב Hibernate מתרחשת באמצעות אובייקטי נתונים הנקראים ישויות. ישויות אלו מייצגות טבלאות ספציפיות במסד הנתונים, וכפי שאתם זוכרים, מחלקות Java יכולות להכיל הפניות למחלקות אחרות. קשרים אלו באים לידי ביטוי גם במסד הנתונים. ככלל, הם מפתחות זרים (עבור קשרי גומלין של OneToOne, OneToMany, ManyToOne) או טבלאות ביניים (עבור קשרי גומלין של ManyToMany). כאשר לישות שלך יש הפניות לישויות קשורות אחרות, הערות ממוקמות מעל הפניות אלה כדי לציין את סוג הקשר: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany. אתה יכול לציין את סוג המפל עבור קשר זה במאפיין המפל של ההערות. ל-JPA יש שיטות ספציפיות לאינטראקציה עם ישויות (להתמיד, לשמור, להתמזג...). סוגי אשד משמשים כדי להראות כיצד נתונים קשורים צריכים להתנהג; שיטות אלה משמשות על ישות יעד. אז מהן אסטרטגיות המדרגות (סוגי אשד)? תקן JPA מספק שימוש בשישה סוגי מפל:-
PERSIST - פעולות השמירה מתרחשות במפל (עבור המתודות save() ו- persist() ). במילים אחרות, אם אנחנו שומרים ישות שמשויכת לישויות אחרות, אז הישויות האלה נשמרות גם במסד הנתונים (אם הן לא כבר שם)
-
MERGE - פעולות עדכון מתרחשות במפל (עבור שיטת המיזוג() )
-
REMOVE - פעולות המחיקה מתרחשות במפל ( שיטת remove() )
-
ALL — מכיל שלוש פעולות מדורגות בבת אחת — PERSIST — MERGE — REMOVE
-
DETACH - ישויות קשורות אינן מנוהלות על ידי ההפעלה ( שיטת detach() ). כלומר, כאשר הנתונים של הגופים הקשורים משתנים, הנתונים במסד הנתונים אינם מתעדכנים אוטומטית - הם מומרים מתמיד למנותק (כלומר, הישות אינה מנוהלת על ידי JPA)
-
REFRESH - בכל פעם שישות מתרעננת עם נתונים ממסד הנתונים ( refresh() - מרענן אובייקטים מנותקים), גם הישויות הקשורות לה מתרעננות. לדוגמה, שינית איכשהו את הנתונים שנלקחו ממסד הנתונים, ואתה רוצה לשחזר את הערכים המקוריים. במקרה זה, תמצא פעולה זו שימושית.

-
REPLICATE - משמש כאשר יש לנו יותר ממקור נתונים אחד ואנו רוצים שהנתונים יסונכרנו (שיטת השכפול של Hibernate). לכל הישויות חייבות להיות מזהים (מזהה) כדי להבטיח שניתן ליצור אותן ללא בעיות (כדי להבטיח שלאותה ישות אין מזהים שונים עבור מסדי נתונים שונים)
-
SAVE_UPDATE - שמירה/מחיקה מדורגת (עבור שיטת saveOrUpdate של Hibernate)
-
LOCK - ההפך מפעולת DETACHED : ממירה ישות מנותקת חזרה למצב מתמשך, כלומר, ההפעלה הנוכחית תעקוב אחר הישות שוב
54. האם מחלקת ישות יכולה להיות מופשטת?
לפי 2.1 מחלקת הישות של מפרט JPA , " מחלקות מופשטות וגם מחלקות קונקרטיות יכולות להיות ישויות. " לכן, התשובה היא כן, מחלקה מופשטת יכולה להיות ישות וניתן לסמן אותה עם ההערה @Entity.55. מהו מנהל ישות? על מה זה אחראי?
קודם כל, אני רוצה לציין ש- EntityManager הוא מרכיב מכריע ב- JPA . הוא משמש לאינטראקציה של ישויות עם מסד הנתונים. באופן כללי, שיטות לאינטראקציה של הישות עם מסד הנתונים נקראות על הישות (persist, merge, remove, detach)... אבל אני גם מציין שרכיב זה לרוב אינו יחיד עבור האפליקציה כולה. לעתים קרובות הוא קל משקל, אחד נמחק, ואחד חדש נוצר באמצעות EntityManagerFactory . אם נצייר הקבלה ל- JDBC , שבו EntityManagerFactory הוא אנלוגי ל- DataSource , אז EntityManager הוא אנלוגי ל- Connection . קודם לכן, ציינתי שישות מתמשכת היא ישות המנוהלת על ידי החיבור הנוכחי. ישות זו מנוהלת על ידי EntityManager , אשר קשור קשר הדוק לחיבור הנוכחי, ו- TransactionManager , אשר אחראי על פתיחת/סגירת עסקאות. באיור למטה, ניתן לראות את מחזור החיים של הישות:
56. מהי מחלקת אסר? למה משתמשים בו?
לא שמעתי על מחלקה כזו ב- JPA , אז אניח שהשאלה הזו מתייחסת למחלקה שנמצאת בספריית JUnit המשמשת למבחני יחידות. בספרייה זו, המחלקה Assert משמשת לבדיקת התוצאות של ביצוע קוד (כאן assert פירושו קביעה שיש לך מצב/נתונים ספציפיים במיקום ספציפי בקוד). לדוגמה, נניח שאתה בודק שיטה שאמורה ליצור חתול. אתה מפעיל את השיטה ומקבל תוצאה כלשהי:Cat resultOfTest = createCat();
אבל אתה צריך לוודא שהוא נוצר בצורה נכונה, נכון? אז אתה יוצר ידנית חתול ספציפי ( expectCat ) עם בדיוק הפרמטרים שאתה מצפה לראות בחתול המתקבל בשיטת createCat() . לאחר מכן אתה משתמש במחלקה Assert כדי לאמת את התוצאות:
Assert.assertEquals(resultOfTest, expectedCat);
אם החתולים שונים, אזי תזרק AssertionError , שאומרת לנו שלא קיבלנו את התוצאות הצפויות. למחלקה Assert יש שיטות רבות ושונות המכסות מגוון פעולות המסייעות באימות התוצאות הצפויות. הנה כמה מהם:
-
assertTrue(<boolean>) - הערך המועבר כארגומנט צפוי להיות נכון
-
assertFalse(<boolean>) - הערך המועבר כארגומנט צפוי להיות שקר
-
assertNotEquals(<object1>, <object2>) - האובייקטים המועברים כארגומנטים חייבים להיות שונים בהשוואה באמצעות שווים ( false )
-
assertThrows(<ClassNameOfException>.class, <exceptionObject>) - הארגומנט השני צפוי להיות חריג שנזרק על ידי הארגומנט הראשון (כלומר הארגומנט השני הוא בדרך כלל קריאת מתודה שאמורה לזרוק חריג מהסוג הנדרש)
חוּט
57. תאר את מחלקת ה-String של Java
מחרוזת היא מחלקה סטנדרטית של ג'אווה האחראית על אחסון ומניפולציה של ערכי מחרוזת (רצפים של תווים). זהו מחלקה בלתי ניתנת לשינוי (כתבתי על immutable בעבר כאן ), כלומר, לא ניתן לשנות את הנתונים של אובייקטים של מחלקה זו לאחר יצירתם. ברצוני לציין מיד שהמחלקות StringBuilder ו- StringBuffer זהות במהותן - ההבדל היחיד הוא שאחת מהן מיועדת לשימוש בסביבה מרובת הליכים ( StringBuffer ). מחלקות אלו דומות למחרוזת , אך שונות בכך שהן ניתנות לשינוי . גם לאחר שהם נוצרו, הם מאפשרים לך לשנות את המחרוזות שהם מייצגים, מבלי ליצור אובייקט חדש. השיטות שלהם שונות משיטות ה-String הסטנדרטיות והן מיועדות למניפולציה של מחרוזות (יש סיבה שהם קוראים לזה בונה).58. מהן הדרכים ליצור אובייקט מחרוזת? איפה זה נוצר?
הדרך הנפוצה ביותר ליצור מחרוזת היא לציין את הערך שאנו רוצים במרכאות כפולות בפשטות:String str = "Hello World!";
אתה יכול גם לעשות זאת במפורש באמצעות חדש :
String str = new String("Hello World!");
אתה יכול גם ליצור מחרוזת ממערך של תווים:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
נוכל לעשות זאת על ידי קריאה למתודה toString על אובייקט כלשהו:
String str = someObject.toString();
נוכל לעשות זאת על ידי קריאה לכל שיטה אחרת שמחזירה מחרוזת. דוגמא:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
אתה מבין שיכולות להיות הרבה מאוד דרכים ליצור מחרוזת. כאשר אובייקט String נוצר, הוא מאוחסן במאגר מחרוזות , שעליו נדון ביתר פירוט באחת השאלות שלהלן.
59. איך משווים בין שתי מחרוזות Java, ואיך ממיינים אותן?
Java משתמשת בסימן שווה כפול ( == ) כדי לבצע השוואות. אם אנחנו צריכים להשוות ערכים פשוטים כמו ints, נשתמש בזה. אבל שיטה זו אינה מתאימה להשוואת אובייקטים מן המניין. זה ישווה רק הפניות, כלומר אם ההפניות מצביעות על אותו אובייקט או לא. זה אומר שאם נשווה שני אובייקטים עם אותם ערכי שדה באמצעות == , נקבל false . לשדות יש אותם ערכים, אבל האובייקטים עצמם תופסים מיקומים שונים בזיכרון. חפצי מחרוזת , למרות פשטותם המתעתעת, הם עדיין חפצים. גם השוואה ביניהם באמצעות == אינה מתאימה (למרות נוכחותה של בריכת מיתר). הפתרון המתאים הוא שיטת ה-standard equals של מחלקת Object , אותה יש לעקוף כדי לעבוד כהלכה (כברירת מחדל, היא משתמשת ב -== לצורך השוואות). המחלקה String עוקפת אותו, אז אנחנו פשוט משתמשים ביישום שלה:String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);

TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
פלט מסוף:
60. ספק אלגוריתם להמרת מחרוזת לתווים. כתוב את הקוד המתאים
כפי שאמרתי קודם, לאובייקטי מחרוזת יש הרבה שיטות שימושיות שונות. אחד מהם הוא toCharArray . שיטה זו ממירה מחרוזת למערך תווים:String str = "Hello world";
char[] charArr = str.toCharArray();
לאחר מכן, יש לנו מערך של תווים שנוכל להתייחס אליהם לפי אינדקס:
char firstChar = charArr[0]; // H
61. איך ממירים מחרוזת למערך בתים ובחזרה? כתוב את הקוד המתאים
למחלקה String יש מתודה getBytes , הדומה לשיטת toCharArray ומחזירה את המחרוזת כמערך בתים:String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
הגענו למסקנה ההגיונית של הסקירה שלנו היום. תודה שקראת!
GO TO FULL VERSION