חריג מיפוי שינה - ישות לא ידועה

עליון התמדה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. הבעיה

מאמר זה הולך לדון ב org.hibernate.MappingException: ישות לא ידועה נושא ופתרונות, הן עבור תרדמת שינה והן עבור סביבת אביב ומצב שינה.

2. חסר או לא חוקי @יֵשׁוּת ביאור

הסיבה השכיחה ביותר לחריג המיפוי היא פשוט מחלקת ישויות חסר @יֵשׁוּת ביאור:

מחלקה ציבורית Foo מיישמת {@Id @GeneratedValue (אסטרטגיה = GenerationType.AUTO) מזהה פרטי פרטי; Foo ציבורי () {סופר (); } ציבורי ארוך getId () {id מזהה; } בטל ציבורי ריק (מזהה ארוך) {this.id = id; }}

אפשרות אחרת היא שזה יכול להיות הסוג הלא נכון של @יֵשׁוּת ביאור:

יבוא org.hibernate.annotations.Entity; כיתת Foo בכיתה הציבורית @Entity מיישמת את הסידור {...

המוחלש org.hibernate.annotations.Entity הוא הסוג הלא נכון של ישות לשימוש - מה שאנחנו צריכים זה javax. התמדה. ישות:

ייבא javax.persistence.Entity; כיתת Foo בכיתה הציבורית @Entity מיישמת את הסידור {...

3. MappingException עם אביב

התצורה של Hibernate באביב כרוכה באתחול ה- SessionFactory מסריקת ביאורים, דרך א LocalSessionFactoryBean:

@Bean LocalSessionFactory ציבורי Bean sessionFactory () {LocalSessionFactoryBean sessionFactory = חדש LocalSessionFactoryBean (); sessionFactory.setDataSource (restDataSource ()); ... return sessionFactory; }

בתצורה הפשוטה הזו של שעועית מפעל הפגישה חסר מרכיב מרכזי ובדיקה שמנסה להשתמש ב- SessionFactory ייכשל:

... @ SessionFactory פרטית אוטומטית sessionFactory; @Test (צפוי = MappingException.class) @ Transactional public void givenEntityIsPersisted_thenException () {sessionFactory.getCurrentSession (). SaveOrUpdate (Foo חדש ()); }

היוצא מן הכלל הוא כצפוי - MappingException: ישות לא ידועה:

org.hibernate.MappingException: יישות לא ידועה: com.baeldung.ex.mappingexception.persistence.model.Foo at o.h.i.SessionFactoryImpl.getEntityPersister (SessionFactoryImpl.java:1141)

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

אנחנו יכולים לציין איזה חבילות לחיפוש שיעורי ישות במסלול הכיתה:

sessionFactory.setPackagesToScan (מחרוזת חדשה [] {"com.baeldung.ex.mappingexception.persistence.model"});

או שאנחנו יכולים פשוט לרשום את שיעורי הישות ישירות למפעל הפעלה:

sessionFactory.setAnnotatedClasses (מחלקה חדשה [] {Foo.class});

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

4. MappingException עם שינה

בואו נראה כעת את השגיאה בשימוש רק במצב שינה:

מחלקה ציבורית Cause4MappingExceptionIntegrationTest {@Test public void givenEntityIsPersisted_thenException () זורק IOException {SessionFactory sessionFactory = configureSessionFactory (); מושב מושב = sessionFactory.openSession (); session.beginTransaction (); session.saveOrUpdate (Foo חדש ()); session.getTransaction (). commit (); } SessionFactory פרטי configureSessionFactory () זורק IOException {תצורת תצורה = תצורה חדשה (); InputStream inputStream = this.getClass (). GetClassLoader (). getResourceAsStream ("hibernate-mysql.properties"); מאפיינים hibernateProperties = מאפיינים חדשים (); hibernateProperties.load (inputStream); configuration.setProperties (hibernateProperties); // configuration.addAnnotatedClass (Foo.class); ServiceRegistry serviceRegistry = ServiceRegistryBuilder חדש (). applySettings (configuration.getProperties ()). buildServiceRegistry (); SessionFactory sessionFactory = configuration.buildSessionFactory (serviceRegistry); מפגש חזרה מפעל; }}

ה hibernate-mysql.properties הקובץ מכיל את מאפייני התצורה של מצב שינה:

hibernate.connection.username = tutorialuser hibernate.connection.password = tutorialmy5ql hibernate.connection.driver_class = com.mysql.jdbc.Driver hibernate.dialect = org.hibernate.dialect.MySQL5Dialect hibernate.connection.url = jd: localhost: 3306 / spring_hibernate4_exceptions hibernate.show_sql = false hibernate.hbm2ddl.auto = create

הפעלת בדיקה זו תביא לאותו חריג מיפוי:

org.hibernate.MappingException: ישות לא ידועה: com.baeldung.ex.mappingexception.persistence.model.Foo at o.h.i.SessionFactoryImpl.getEntityPersister (SessionFactoryImpl.java:1141)

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

configuration.addAnnotatedClass (Foo.class);

זה מתקן את הבדיקה - המסוגלת כעת להחזיק את ישות Foo.

5. מסקנה

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

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

תחתית התמדה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס