מדריך לנוהלים מאוחסנים עם JPA

1. הקדמה

במדריך מהיר זה נחקור את השימוש בהליכים מאוחסנים בתוך Java Persistence API (JPA).

2. הגדרת פרויקט

2.1. הגדרת Maven

ראשית עלינו להגדיר את התלות הבאות שלנו pom.xml:

  • javax.javaee-api - מכיוון שהוא כולל את ה- API של JPA
  • יישום JPA API - בדוגמה זו נשתמש שינה, אבל EclipseLink תהיה חלופה בסדר גם כן
  • א MySQL מאגר מידע
 7.0 11.2.0.4 5.1.38 javax javaee-api $ {jee.version} סיפק org.hibernate hibernate-core $ {hibernate.version} mysql mysql-connector-java $ {mysql.version} 

2.2. הגדרת יחידת התמדה

השלב השני הוא יצירת src / main / resources / META-INF / persistence.xml קובץ - המכיל את הגדרות יחידת ההתמדה:

   org.hibernate.jpa.HibernatePersistenceProvider com.baeldung.jpa.model.Car 

אין צורך בכל מאפייני שינה שהוגדרו אם אתה מתייחס ל- JNDI DataSource (סביבות JEE):

java: jboss / datasources / JpaStoredProcedure

2.3. סקריפט ליצירת טבלאות

בואו ניצור כעת טבלה (CAR) - עם שלוש תכונות: תעודת זהות, דגם ו שָׁנָה:

צור טבלה 'רכב' ('מזהה' int (10) לא NULL AUTO_INCREMENT, 'דגם' varchar (50) לא NULL, 'YEAR' int (4) לא NULL, מפתח ראשוני ('ID')) מנוע = InnoDB AUTO_INCREMENT = 2 CHARSET ברירת מחדל = utf8;

ההנחה הייתה כמובן שסכמת ה- DB וההרשאות כבר קיימות.

2.4. יצירת נוהל מאוחסן ב- DB

השלב האחרון לפני הקפיצה לקוד Java הוא יצירת ההליך המאוחסן במסד MySQL שלנו:

DELIMITER $$ CREATE DEFINER = `root` @` localhost` נוהל `FIND_CAR_BY_YEAR '(ב- p_year int) התחל בחר מזהה, דגם, שנה ממכונית היכן שנה = p_year; סיום $$ DELIMITER;

3. הנוהל המאוחסן של JPA

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

ברגע שנעשה זאת, נוכל גם לחזור על התוצאות כ- רשימה שֶׁל אוטו.

3.1. ה אוטו יֵשׁוּת

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

שים לב שאנו מגדירים את ההליך המאוחסן שלנו ישירות על הישות באמצעות ה- @NamedStoredProcedureQueries ביאור:

@Entity @Table (name = "CAR") @NamedStoredProcedureQueries ({@NamedStoredProcedureQuery (name = "findByYearProcedure", procedureName = "FIND_CAR_BY_YEAR", resultClasses = {Car.class}, parameters = {@StoredProcedureProcedure) type = Integer.class, mode = ParameterMode.IN)}}}) מחלקה ציבורית רכב {id ארוך פרטי; מודל מחרוזת פרטי; שנת שלם פרטית; רכב ציבורי (דגם מחרוזת, שנה שלמה) {this.model = דגם; this.year = שנה; } רכב ציבורי () {} @Id @GeneratedValue (אסטרטגיה = GenerationType.IDENTITY) @Column (name = "ID", ייחודי = true, nullable = false, scale = 0) public long ID getId () {return id; } @Column (name = "MODEL") מחרוזת ציבורית getModel () {מודל החזרה; } @Column (name = "YEAR") GetYear ציבורי שלם () {שנה חוזרת; } // שיטות קובעות סטנדרטיות}

3.2. גישה למסד הנתונים

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

אנחנו הולכים לאחזר הכל מכוניות בנתון שָׁנָה:

כיתה ציבורית StoredProcedureTest {מפעל פרטי סטטי EntityManagerFactory = null; פרטי סטטי EntityManager entityManager = null; @BeforeClass סטטי ציבורי ריק () {factory = Persistence.createEntityManagerFactory ("jpa-db"); entityManager = factory.createEntityManager (); } @Test ציבורי בטל findCarsByYearWithNamedStored () {StoredProcedureQuery findByYearProcedure = entityManager.createNamedStoredProcedureQuery ("findByYearProcedure"); StoredProcedureQuery storeProcedure = findByYearProcedure.setParameter ("p_year", 2015); storeProcedure.getResultList () .forEach (c -> Assert.assertEquals (מספר שלם חדש (2015), ((רכב) c) .getYear ())); } @Test ציבורי בטל findCarsByYearNoNamedStored () {StoredProcedureQuery storeProcedure = entityManager .createStoredProcedureQuery ("FIND_CAR_BY_YEAR", Car.class) .registerStoredProcedureParameter (1, Interger.Meter. storeProcedure.getResultList () .forEach (c -> Assert.assertEquals (מספר שלם חדש (2015), ((רכב) c) .getYear ())); }} 

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

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

4. מסקנה

במדריך זה דנו בשימוש ב- Stored Procedure עם ה- Java Persistence API.

הדוגמה המשמשת במאמר זה זמינה כפרויקט לדוגמא ב- GitHub.


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