מבוא ל- Apache Cayenne ORM

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

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

בחלקים הבאים נראה כיצד ליצור אינטראקציה עם מסד נתונים של MySQL באמצעות Apache Cayenne ORM.

2. תלות Maven

כדי להתחיל, עלינו רק להוסיף את התלות הבאות כדי להעלות את מחבר Apache Cayenne ו- MySQL לנהג JDBC יחד כדי לגשת ל intro_cayenne מאגר מידע:

 org.apache.cayenne cayenne-server 4.0.M5 mysql mysql-connector-java 5.1.44 זמן ריצה 

בואו להגדיר את התוסף למעצב קאיין שישמש לעיצוב או הגדרת קובץ המיפוי שלנו שמשמש כגשר בין סכימת מסד הנתונים לאובייקט Java:

 org.apache.cayenne.plugins maven-cayenne-modeler-plugin 4.0.M5 

במקום לבנות קובץ מיפוי XML בעבודת יד (נעשה לעיתים רחוקות), מומלץ להשתמש במדגם שהוא כלי מתקדם למדי שמגיע עם הפצת קאיין.

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

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

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

3. התקנה

כדי לגרום לאפאצ'י קאיין לחפש את מסד הנתונים המקומי הנכון, עלינו רק למלא את קובץ התצורה שלו במנהל ההתקן, בכתובת האתר ובמשתמש הנכון בקובץ. cayenne-project.xml ממוקם ב אֶמְצָעִי מַדרִיך:

כאן אנו יכולים לראות את זה:

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

מבפנים, זה ה XMLPoolingDataSourceFactory אחראי לטעינת מידע על חיבור JDBC ממשאב XML המשויך ל- DataNodeDescriptor.

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

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

4. מיפוי ועיצוב מסדי נתונים

4.1. דוּגמָנוּת

בואו עכשיו נלחץ על ה- "פרוייקט פתוח", נווט לתיקיית המשאבים של הפרויקט ובחר את הקובץ cayenne-project.xml, המדגם יראה זאת:

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

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

  • מחבר: id (PK) ו שֵׁם
  • מאמר: id (PK), כותרת, תוכן, ו author_id (FK)

עכשיו בוא נלך אל “כלים> סכימת מסד נתונים של Reengineer", ונמלא את כל תצורות המיפוי שלנו באופן אוטומטי. במסך הפקודה פשוט מלא את תצורת מקור הנתונים הזמינה שם ב cayenne-project.xml הקובץ והקש המשך:

במסך הבא עלינו לבדוק "השתמש בסוגים פרימיטיביים של Java" באופן הבא:

אנחנו צריכים גם להבטיח לשים com.baeldung.apachecayenne. מתמיד כחבילת Java ושמור אותה; נראה שקובץ התצורה של XML עודכן עבורו defaultPackage מאפיין שיתאים לחבילת Java:

בכל אחד אובייקט עלינו לציין את החבילה עבור מחלקות המשנה כפי שמוצג בתמונה הבאה ולחץ על "לשמור" סמל שוב:

מעתה והלאה "כלים> צור שיעורים" בתפריט, בחר “אובייקטים סטנדרטיים קבועים”כסוג; ועל "שיעורים" הכרטיסייה בדוק את כל הכיתות והקש "לִיצוֹר".

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

שים לב שכל התצורות האלה נשמרות בקובץ datamap.map.xml ממוקם גם ב אֶמְצָעִי תיקיה.

4.2. מבנה מיפוי

קובץ מיפוי ה- XML ​​שנוצר בתיקיית המשאבים משתמש בכמה תגים ייחודיים ביחס ל- Apache Cayenne:

  • DataNode () - המודל של מסד הנתונים, תוכנו כל המידע הדרוש כדי להתחבר למסד נתונים (שם מסד הנתונים, מנהל ההתקן ותעודות המשתמש)
  • DataMap () זה מיכל של ישויות עיקשות עם היחסים ביניהם
  • DbAttribute () - מייצג עמודה בטבלת מסד נתונים
  • DbEntity () - המודל של טבלת מסד נתונים או תצוגה יחידה, זה יכול להיות בעל תכונות DbAtulations וקשרים
  • ObjEntity () - המודל של מעמד ג'אווה מתמשך יחיד; עשוי מ- ObjAttribute המתאימים למאפייני מחלקת ישויות ו- ObjRelationships שהם מאפיינים שיש להם סוג של ישות אחרת
  • ניתן להטמיע () - המודל של מחלקת Java הפועל כמאפיין של ObjEntity, אך תואם למספר עמודות במסד הנתונים
  • תהליך() - לרישום ההליך המאוחסן במסד הנתונים
  • שאילתא() - המודל של שאילתה, המשמש למיפוי שאילתה בקובץ התצורה מבלי לשכוח שנוכל לעשות זאת גם בקוד

להלן הפרטים המלאים.

5. API של קאיין

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

5.1. יצירת אובייקט

הנה, אנחנו פשוט שומרים מְחַבֵּר התנגד ובדוק אחר כך שיש רק רשומה אחת מסוג זה במסד הנתונים:

@ מבחן פומבי בטל כאשר Insert_thenWeGetOneRecordInTheDatabase () {Author author = context.newObject (Author.class); author.setName ("פול"); context.commitChanges (); רשומות ארוכות = ObjectSelect.dataRowQuery (Author.class) .selectCount (הקשר); assertEquals (1, רשומות); }

5.2. קריאת אובייקט

לאחר שמירת מְחַבֵּר, אנחנו פשוט בוחרים אותו בין השאר באמצעות שאילתה פשוטה של ​​נכס מסוים:

@ מבחן פומבי בטל כאשר Insert_andQueryByFirstName_thenWeGetTheAuthor () {מחבר מחבר = context.newObject (מחבר.קלאס); author.setName ("פול"); context.commitChanges (); מחבר expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("פול")) .selectOne (הקשר); assertEquals ("פול", expectAuthor.getName ()); }

5.3. אחזור כל הרשומות בכיתה

אנו נשמור שני מחברים ואחזור אוסף של אובייקטים של מחברים כדי לבדוק שיש רק שני אלה שנשמרו:

@ מבחן ציבורי בטל כאשר Insert_andQueryAll_thenWeGetTwoAuthors () {מחבר firstAuthor = context.newObject (מחבר.קלאס); firstAuthor.setName ("פול"); מחבר secondAuthor = context.newObject (מחבר.קלאס); secondAuthor.setName ("לודוביץ '"); context.commitChanges (); רשימת מחברים = ObjectSelect .query (Author.class) .select (הקשר); assertEquals (2, author.size ()); }

5.4. עדכון אובייקט

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

@ מבחן פומבי בטל כאשרUpdating_thenWeGetAnUpatedeAuthor () {מחבר מחבר = context.newObject (מחבר.קלאס); author.setName ("פול"); context.commitChanges (); מחבר expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("פול")) .selectOne (הקשר); expectAuthor.setName ("גרסיה"); context.commitChanges (); assertEquals (author.getName (), expectAuthor.getName ()); }

5.5. הצמדת אובייקט

אנו יכולים להקצות מאמר לסופר:

@ מבחן ציבורי בטל כאשר AttachingToArticle_thenTheRelationIsMade () {Author author = context.newObject (Author.class); author.setName ("פול"); מאמר מאמר = context.newObject (Article.class); article.setTitle ("כותרת ההודעה שלי"); article.setContent ("התוכן"); article.setAuthor (מחבר); context.commitChanges (); מחבר expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("סמית")) .selectOne (הקשר); מאמר expectArticle = (expectAuthor.getArticles ()). Get (0); assertEquals (article.getTitle (), expectArticle.getTitle ()); }

5.6. מחיקת אובייקט

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

@ מבחן ציבורי בטל כאשר מחיקת_ואנלוזהדיטייל () {מחבר מחבר = context.newObject (מחבר.קלאס); author.setName ("פול"); context.commitChanges (); מחבר savedAuthor = ObjectSelect.query (מחבר.קלאס). איפה (Author.NAME.eq ("פול")) .selectOne (הקשר); אם (savedAuthor! = null) {context.deleteObjects (מחבר); context.commitChanges (); } מחבר expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("פול")) .selectOne (הקשר); assertNull (צפוימחבר); }

5.7. מחק את כל הרשומות בכיתה

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

@ לאחר בטל פומבי deleteAllRecords () {SQLTemplate deleteArticles = SQLTemplate חדש (Article.class, "מחק ממאמר"); SQLTemplate deleteAuthors = SQLTemplate חדש (מחבר.קלאס, "מחק מהמחבר"); context.performGenericQuery (deleteArticles); context.performGenericQuery (deleteAuthors); }

6. מסקנה

במדריך זה התמקדנו בשימוש ב- Apache Cayenne ORM כדי להדגים בקלות כיצד לבצע פעולות CRUD עם a אחד לרבים מערכת יחסים.

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


$config[zx-auto] not found$config[zx-overlay] not found