ממירי תכונות JPA

1. הקדמה

במאמר מהיר זה, נסקור את השימוש בממירי התכונות הזמינים ב- JPA 2.1 - אשר במילים פשוטות מאפשרים לנו למפות סוגי JDBC לשיעורי Java.

נשתמש ב- Hibernate 5 כמימוש ה- JPA שלנו כאן.

2. יצירת ממיר

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

ראשית, בואו ניצור a PersonName class - שיומר לאחר מכן:

יישום אישי של המחלקה הציבורית ניתן לממש לפי סדר {שם מחרוזת פרטי; שם משפחה פרטי מחרוזת; // גטרים וקובעים}

לאחר מכן נוסיף מאפיין מסוג PersonName ל @יֵשׁוּת מעמד:

@Entity (name = "PersonTable") מחלקה ציבורית אדם {personName personName פרטי; // ...}

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

לעשות זאת עלינו לשים לב למחלקת הממירים שלנו עם @מֵמִיר וליישם את AttributeConverter מִמְשָׁק. נפרמט את הממשק עם סוגי המחלקה ועמודת מסד הנתונים, לפי הסדר הזה:

@Converter מחלקה ציבורית PersonNameConverter מיישם AttributeConverter {פרטי סטטי פרטי מחרוזת SEPARATOR = ","; @Override מחרוזת ציבורית convertToDatabaseColumn (PersonName personName) {if (personName == null) {return null; } StringBuilder sb = StringBuilder חדש (); אם (personName.getSname ()! = null &&! personName.getSname () .isEmpty ()) {sb.append (personName.getSname ()); sb.append (SEPARATOR); } אם (personName.getName ()! = null &&! personName.getName (). isEmpty ()) {sb.append (personName.getName ()); } להחזיר sb.toString (); } @Override Public PersonName convertToEntityAttribute (מחרוזת dbPersonName) {if (dbPersonName == null || dbPersonName.isEmpty ()) {return null; } מחרוזת [] חתיכות = dbPersonName.split (מפריד); אם (חתיכות == null || pieces.length == 0) {return null; } PersonName personName = PersonName חדש (); מחרוזת firstPiece =! חתיכות [0] .isEmpty ()? חתיכות [0]: null; אם (dbPersonName.contains (SEPARATOR)) {personName.setSname (firstPiece); if (pieces.length> = 2 && pieces [1]! = null && pieces! [1] .isEmpty ()) {personName.setName (pieces [1]); }} אחר {personName.setName (firstPiece); } להחזיר personName; }}

שימו לב שהיינו צריכים ליישם שתי שיטות: convertToDatabaseColumn () ו convertToEntityAttribute ().

שתי השיטות משמשות להמרה מהתכונה לעמודת מסד נתונים ולהיפך.

3. שימוש בממיר

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

@Entity (name = "PersonTable") אדם בכיתה ציבורית {@Convert (converter = PersonNameConverter.class) PersonName personName; // ...}

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

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

@Test הציבור בטל givenPersonName_whenSaving_thenNameAndSurnameConcat () {שם מחרוזת = "שם"; שם משפחה מחרוזת = "שם משפחה"; PersonName personName = חדש PersonName (); personName.setName (שם); personName.setSurname (שם משפחה); אדם אדם = אדם חדש (); person.setPersonName (personName); מזהה ארוך = (ארוך) session.save (אדם); session.flush (); session.clear (); }

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

@Test public void givenPersonName_whenSaving_thenNameAndSnameConcat () {// ... String dbPersonName = (String) session.createNativeQuery ("select p.personName from PersonTable p where p.id =: id"). SetParameter ("id", id). getSingleResult (); assertEquals (שם משפחה + "," + שם, dbPersonName); }

בואו גם לבדוק שההמרה מהערך המאוחסן במסד הנתונים ל PersonName class עובד כהגדרתו בממיר על ידי כתיבת שאילתה השואבת את השלם אדם מעמד:

@Test public void givenPersonName_whenSaving_thenNameAndSnameConcat () {// ... Person dbPerson = session.createNativeQuery ("select * from PersonTable p where p.id =: id", Person.class) .setParameter ("id", id) .getSingleResult (); assertEquals (dbPerson.getPersonName () .getName (), שם); assertEquals (dbPerson.getPersonName () .getSurname (), שם משפחה); }

4. מסקנה

במדריך קצר זה הראינו כיצד להשתמש בממיר התכונות שהוצג לאחרונה ב- JPA 2.1.

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