מדריך למודול נתונים של DeltaSpike

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

Apache DeltaSpike הוא פרויקט המספק אוסף של סיומות CDI לפרויקטים של Java; זה מחייב יישום CDI להיות זמין בזמן הריצה.

כמובן, זה יכול לעבוד עם יישום שונה של CDI - JBoss Weld או OpenWebBeans. זה נבדק גם בשרתי יישומים רבים.

במדריך זה נתמקד אחד הידועים והשימושיים ביותר - מודול נתונים.

2. הגדרת מודול נתונים של DeltaSpike

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

זה דומה מאוד לפרויקט Spring Data. כדי לשאול על מסד נתונים, עלינו להגדיר הצהרת שיטה (ללא יישום) העוקבת אחר מוסכמת שמות מוגדרת או המכילה @שאילתא ביאור. היישום ייעשה עבורנו באמצעות סיומת CDI.

בסעיפי המשנה הבאים נסקור כיצד להתקין את מודול ה- Apache DeltaSpike Data ביישום שלנו.

2.1. תלות נדרשת

כדי להשתמש במודול Apache DeltaSpike Data ביישום, עלינו להגדיר תלות נדרשת.

כאשר Maven הוא כלי הבנייה שלנו עלינו להשתמש:

 org.apache.deltaspike.modules deltaspike-data-module-api 1.8.2 הידור org.apache.deltaspike.modules deltaspike-data-module-impl 1.8.2 זמן ריצה 

כאשר אנו משתמשים ב- Gradle:

זמן ריצה 'org.apache.deltaspike.modules: deltaspike-data-module-impl' הידור 'org.apache.deltaspike.modules: deltaspike-data-module-api' 

חפצי מודול נתונים של Apache DeltaSpike זמינים ב- Maven Central:

  • deltaspike-data-module-impl
  • deltaspike-data-module-api

ל להפעיל יישום עם מודול נתונים, אנו זקוקים גם ליישומי JPA ו- CDI זמינים בזמן הריצה.

למרות שניתן להריץ את Apache DeltaSpike ביישום Java SE, ברוב המקרים הוא ייפרס בשרת היישומים (למשל, Wildfly או WebSphere).

לשרתי יישומים יש תמיכה מלאה בג'קרטה EE, כך שאנחנו לא צריכים לעשות שום דבר נוסף. במקרה של יישום Java SE, עלינו לספק יישומים אלה (למשל, על ידי הוספת תלות ל- Hibernate ו- JBoss Weld).

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

2.2. תצורת מנהל הישויות

ה מודול נתונים דורש EntityManager מוזרק מעל CDI.

אנו יכולים להשיג זאת באמצעות מפיק CDI:

מחלקה ציבורית EntityManagerProducer {@PersistenceContext (unitName = "primary") EntityManager entityManager פרטי; @ApplicationScoped @Produces EntityManager ציבורית getEntityManager () {return entityManager; }}

הקוד לעיל מניח שיש לנו יחידת התמדה עם שם יְסוֹדִי מוגדר ב התמדה.קסמל קוֹבֶץ.

הבה נראה להלן דוגמא להגדרה:

 java: jboss / datasources / baeldung-jee7-seedDS 

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

2.3. אסטרטגיית עסקאות

במקרה שאנו משתמשים בסוג עסקאות JTA עבור מקור הנתונים שלנו, עלינו להגדיר אסטרטגיית עסקה שתשמש במאגרי Apache DeltaSpike. אנחנו יכולים לעשות את זה בפנים apache-deltaspike.properties קובץ (תחת META-INF מַדרִיך):

globalAlternatives.org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy = org.apache.deltaspike.jpa.impl.transaction.ContainerManagedTransactionStrategy

ישנם ארבעה סוגים של אסטרטגיית עסקאות שאנו יכולים להגדיר:

  • BeanManagedUserTransactionStrategy
  • ResourceLocalTransactionStrategy
  • ContainerManagedTransactionStrategy
  • סביבה מודעת טרנזאקציה

כולם מיישמים org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy.

זה היה החלק האחרון בתצורה הנדרשת למודול הנתונים שלנו.

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

3. שיעורי מאגר

כאשר אנו משתמשים במודול הנתונים של Apache DeltaSpike כל מחלקה או ממשק מופשטים יכולים להפוך למאגר מעמד.

כל שעלינו לעשות הוא לעשות זאתלהוסיף מאגר @ביאור עם עבור ישות תכונה המגדירה את ישות JPA שהמאגר שלנו צריך לטפל בה:

משתמש בכיתה ציבורית @Entity {// ...} @Repository (forEntity = User.class) ממשק ציבורי SimpleUserRepository {// ...}

או עם שיעור מופשט:

@Repository (forEntity = User.class) מחלקה מופשטת ציבורית SimpleUserRepository {// ...} 

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

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

4. שאילתה משם השיטה

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

זה נראה למטה:

(ישות | אופציונלי | רשימה | זרם) (קידומת) (נכס [משווה]) {נכס מפעיל [השווה]} 

לאחר מכן נתמקד בכל חלק מההגדרה הזו.

4.1. סוג החזרה

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

השיטה הבאה תשליך חריג במקרה שיש יותר מאחד מִשׁתַמֵשׁ עם שם פרטי:

תקציר ציבורי משתמש findByFirstName (שם מחרוזת);

ההפך אינו נכון - אנו יכולים להגדיר ערך החזר כ- אוסף למרות שהתוצאה תהיה רק ​​ישות אחת.

תקציר מופשט אוסף findAnyByFirstName (שם פרטי מחרוזת);

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

השאילתה לעיל תחזיר את כולם משתמשים עם שם פרטי התואם אפילו לקידומת שם השיטה מרמז על משהו אחר.

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

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

4.2. קידומת לשיטת שאילתות

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

ישנם קידומות רבות לפעולה זו כמו findBy, findAny, מצא הכל. לקבלת הרשימה המפורטת, אנא עיין בתיעוד הרשמי של Apache DeltaSpike:

מופשט ציבורי משתמש findAnyByLastName (שם מחרוזת);

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

ספירת אינטגרציה ציבורית מופשטת ();

גַם, לְהַסִיר קיימת תבנית שיטה שאותה אנו יכולים להוסיף במאגר שלנו:

הסרת בטל תקציר ציבורי (משתמש משתמש)

תמיכה ל countBy ו removeBy קידומות לשיטה יתווספו בגרסה הבאה של Apache DeltaSpike 1.9.0.

החלק הבא מראה כיצד אנו יכולים להוסיף מאפיינים נוספים לשאילתות.

4.3. שאילתה עם מאפיינים רבים

בשאילתה נוכל להשתמש נכסים רבים בשילוב עם ו מפעילים.

תקציר ציבורי אוסף findByFirstNameAndLastName (שם מחרוזת, שם משפחה מחרוזת); תקציר ציבורי אוסף findByFirstNameOrLastName (שם מחרוזת, שם משפחה מחרוזת); 

אנו יכולים לשלב כמה נכסים שנרצה. חיפוש אחר נכסים מקוננים זמין גם הוא ונציג בהמשך.

4.4. שאילתה עם נכסים מקוננים

ה שאילתה יכולה להשתמש גם במאפיינים מקוננים.

בדוגמה הבאה מִשׁתַמֵשׁ לישות יש מאפיין כתובת מסוג כתובת ו כתובת לישות יש עִיר תכונה:

כתובת בכיתה ציבורית @Entity {עיר מחרוזת פרטית; // ...} משתמש בכיתה ציבורית @Entity {@OneToOne כתובת פרטית; // ...} תקציר ציבורי אוסף findByAddress_city (עיר מחרוזת);

4.5. סדר בשאילתה

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

תקציר ציבורי רשימה findAllOrderByFirstNameAsc ();

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

אנו יכולים לשלב הזמנות רבות בקלות:

תקציר ציבורי רשימה findAllOrderByFirstNameAscLastNameDesc (); 

לאחר מכן, נראה כיצד להגביל את גודל תוצאות השאילתה.

4.6. הגבל את גודל ותוצאת השאילתות של השאילתות

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

תקציר ציבורי אוסף findTop2OrderByFirstNameAsc (); תקציר ציבורי אוסף findFirst2OrderByFirstNameAsc ();

ראשון ו חלק עליון יכול לשמש להחלפה.

אנחנו יכולים אז אפשר העמדת שאילתות על ידי מתן שני פרמטרים נוספים: @ FirstResult ו @MaxResult:

תקציר ציבורי אוסף findAllOrderByFirstNameAsc (@FirstResult int התחלה, @MaxResults גודל int);

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

Apache DeltaSpike מספק כמה סוגים בסיסיים שבהם נוכל להשתמש בכדי שיהיו הרבה שיטות מחוץ לקופסה.

בחלק הבא נתמקד כיצד לעשות זאת.

5. סוגי מאגר בסיסיים

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

ממשק ציבורי @Repository UserRepository מרחיב את FullEntityRepository {// ...}

או באמצעות שיעור מופשט:

@ מאגר מחלקה מופשטת ציבורית UserRepository מרחיב את AbstractEntityRepository {// ...} 

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

במקרה שאנחנו משתמשים בסוג מאגר בסיס, אין צורך להעביר תוסף נוסף עבור ישות לייחס ערך ל מאגר @ ביאור.

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

שיעורי מאגר בסיסי מופשט, למשל, AbstractEntityRepository נותן לנו גישה לשדות (באמצעות getters) או לשיטות שימוש בהן נוכל ליצור שאילתה:

רשימה ציבורית findByFirstName (שם מחרוזת) {return typedQuery ("בחר u ממשתמש u שבו u.firstName =? 1"). setParameter (1, firstName) .getResultList (); } 

בדוגמה שלעיל השתמשנו ב- typedQuery שיטת השירות ליצירת יישום מותאם אישית.

האפשרות האחרונה ליצור שאילתה היא להשתמש @שאילתא ביאור שנראה בהמשך.

6. @שאילתא ביאור

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

כברירת מחדל זו שאילתת JPQL:

@Query ("בחר u מהמשתמש u שבו u.firstName =? 1") אוסף מופשט ציבורי findUsersWithFirstName (שם פרטי מחרוזת); 

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

במקרה שאנחנו רוצים להעביר שאילתה דרך SQL מקומי במקום JPQL עלינו להגדיר מאפיין שאילתה נוסף - הוא יליד עם ערך אמיתי:

@Query (value = "select * from User where firstName =? 1", isNative = true) אוסף מופשט ציבורי findUsersWithFirstNameNative (שם מחרוזת);

7. מסקנה

במאמר זה סקרנו את ההגדרה הבסיסית של Apache DeltaSpike והתמקדנו בחלק המרגש - מודול הנתונים. זה דומה מאוד לפרויקט Spring Data.

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

כמו תמיד, דוגמאות הקוד המלאות המשמשות במאמר זה זמינות באתר Github.


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