הגדרת ישויות JPA

1. הקדמה

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

2. ישות

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

2.1. ה יֵשׁוּת ביאור

בוא נגיד שיש לנו POJO שנקרא סטוּדֶנט המייצג את הנתונים של תלמיד ואנחנו נרצה לאחסן אותם במסד הנתונים.

תלמיד בכיתה ציבורית {// שדות, גטרים וקובעים}

על מנת לעשות זאת, עלינו להגדיר ישות כך ש- JPA תהיה מודעת לכך.

אז בואו נגדיר זאת על ידי שימוש ב- @יֵשׁוּת ביאור. עלינו לציין את ההערה הזו ברמת הכיתה. עלינו גם להבטיח שלישות יש בנאי ללא ארגונים ומפתח ראשי:

@Entity תלמיד בכיתה ציבורית {// שדות, גטרים וקובעים}

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

@Entity (name = "student") תלמיד בכיתה ציבורית {// שדות, גטרים וקובעים}

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

2.2. ה תְעוּדַת זֶהוּת ביאור

לכל ישות JPA חייב להיות מפתח ראשי המזהה אותו באופן ייחודי. ה @תְעוּדַת זֶהוּת ביאור מגדיר את המפתח הראשי. אנו יכולים ליצור את המזהים בדרכים שונות אשר מוגדרים על ידי ה- @ GeneratedValue ביאור.

אנו יכולים לבחור מתוך ארבע אסטרטגיות של יצירת מזהים באמצעות ה- אִסטרָטֶגִיָה אֵלֵמֶנט. הערך יכול להיות אוטומטי, שולחן, רצף, אוֹ זהות.

סטודנט בכיתה ציבורית @Entity {@Id @GeneratedValue (אסטרטגיה = GenerationType.AUTO) פרטי מזהה ארוך; שם מחרוזת פרטי; // גטרים וקובעים}

אם נציין GenerationType.אוטומטי, ספק ה- JPA ישתמש בכל אסטרטגיה שתרצה להפיק את המזהים.

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

2.3. ה שולחן ביאור

ברוב המקרים, שם הטבלה במסד הנתונים ושם הישות לא יהיו זהים.

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

@Entity @Table (name = "STUDENT") תלמיד בכיתה ציבורית {// שדות, גטרים וקובעים}

אנו יכולים גם להזכיר את הסכימה באמצעות סכֵימָה אֵלֵמֶנט:

@Entity @Table (name = "STUDENT", schema = "SCHOOL") תלמיד בכיתה ציבורית {// שדות, גטרים וקובעים}

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

אם אנו לא משתמשים ב- @שולחן ביאור, שם הישות ייחשב לשם הטבלה.

2.4. ה טור ביאור

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

ה @טור להערה יש אלמנטים רבים כגון שם, אורך, בטל וייחודי.

@Entity @Table (name = "STUDENT") סטודנט בכיתה ציבורית {@Id @GeneratedValue (אסטרטגיה = GenerationType.AUTO) פרטי מזהה ארוך; @Column (name = "STUDENT_NAME", length = 50, nullable = false, unique = false) שם מחרוזת פרטי; // שדות אחרים, גטרים וקובעים}

ה שֵׁם רכיב מציין את שם העמודה בטבלה. ה אורך אלמנט מציין את אורכו. ה מאפשרת ערכי null אלמנט מציין אם העמודה בטלה או לא, ואת ייחודי רכיב מציין אם העמודה ייחודית.

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

2.5. ה חולף ביאור

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

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

אז בואו נרשום את השדה גיל עם ה @חולף ביאור:

@Entity @Table (name = "STUDENT") תלמיד בכיתה ציבורית {@Id @GeneratedValue (אסטרטגיה = GenerationType.AUTO) פרטי מזהה ארוך; @Column (name = "STUDENT_NAME", אורך = 50, nullable = false) שם מחרוזת פרטי; @ גיל פרטי שלם חולף; // שדות אחרים, גטרים וקובעים}

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

2.6. ה זְמַנִי ביאור

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

לשם כך, יש לנו את @זְמַנִי ביאור:

@Entity @Table (name = "STUDENT") סטודנט בכיתה ציבורית {@Id @GeneratedValue (אסטרטגיה = GenerationType.AUTO) פרטי מזהה ארוך; @Column (name = "STUDENT_NAME", length = 50, nullable = false, unique = false) שם מחרוזת פרטי; @ גיל פרטי שלם חולף; @Temporal (TemporalType.DATE) פרטי תאריך לידה תאריך; // שדות אחרים, גטרים וקובעים}

עם זאת, עם JPA 2.2, יש לנו גם תמיכה ב java.time.LocalDate, java.time.LocalTime, java.time.LocalDateTime, java.time.OffsetTime ו java.time.OffsetDateTime.

2.7. ה נִפקָד ביאור

לפעמים, אולי נרצה להמשיך ב- Java enum סוּג.

אנחנו יכולים להשתמש ב- @נִפקָד ביאור כדי לציין אם ה- enum צריך להחזיק לפי שם או לפי סידור (ברירת מחדל).

מגדר אנושי ציבורי {MALE, FEMALE} 
@Entity @Table (name = "STUDENT") תלמיד בכיתה ציבורית {@Id @GeneratedValue (אסטרטגיה = GenerationType.AUTO) פרטי מזהה ארוך; @Column (name = "STUDENT_NAME", length = 50, nullable = false, unique = false) שם מחרוזת פרטי; @ גיל פרטי שלם חולף; @Temporal (TemporalType.DATE) פרטי תאריך לידה תאריך; מגדר פרטי מגדר @Enumerated (EnumType.STRING); // שדות אחרים, גטרים וקובעים}

בעצם, אנחנו לא צריכים לציין את @נִפקָד ביאור בכלל אם אנחנו הולכים להתמיד ב- מִין דרך enum'S ordinal.

עם זאת, כדי להתמיד ב- מִין על ידי enum שם, הגדרנו את ההערה עם EnumType.STRING.

3. מסקנה

במאמר זה למדנו מה ישויות JPA וכיצד ליצור אותן. למדנו גם על ההערות השונות בהן ניתן להשתמש בהתאמה אישית של הישות.

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