Pengecualian Pemetaan Hibernasi - Entitas Tidak Dikenal

Ketekunan teratas

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Masalahnya

Artikel ini akan membahas org.hibernate.MappingException : Masalah entitas tidak diketahui dan solusi, baik untuk Hibernate maupun untuk lingkungan Spring dan Hibernate.

2. Anotasi @Entity Tidak Ada atau Tidak Valid

Penyebab paling umum untuk pengecualian pemetaan hanya kelas entitas hilang @ Entity penjelasan :

public class Foo implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; public Foo() { super(); } public long getId() { return id; } public void setId(long id) { this.id = id; } }

Kemungkinan lain adalah bahwa hal itu mungkin memiliki salah jenis @ Entity penjelasan :

import org.hibernate.annotations.Entity; @Entity public class Foo implements Serializable { ...

Org.hibernate.annotations.Entity yang tidak digunakan lagi adalah jenis entitas yang salah untuk digunakan - yang kami butuhkan adalah javax.persistence.Entity :

import javax.persistence.Entity; @Entity public class Foo implements Serializable { ...

3. MappingException Dengan Spring

Konfigurasi Hibernate di Musim Semi melibatkan bootstrap SessionFactory dari pemindaian anotasi, melalui LocalSessionFactoryBean :

@Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); sessionFactory.setDataSource(restDataSource()); ... return sessionFactory; }

Konfigurasi sederhana dari Session Factory Bean ini kehilangan bahan utama, dan pengujian yang mencoba menggunakan SessionFactory akan gagal:

... @Autowired private SessionFactory sessionFactory; @Test(expected = MappingException.class) @Transactional public void givenEntityIsPersisted_thenException() { sessionFactory.getCurrentSession().saveOrUpdate(new Foo()); }

Pengecualiannya adalah, seperti yang diharapkan - MappingException: Entitas tidak diketahui :

org.hibernate.MappingException: Unknown entity: com.baeldung.ex.mappingexception.persistence.model.Foo at o.h.i.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1141)

Sekarang, ada dua solusi untuk masalah ini - dua cara untuk memberi tahu LocalSessionFactoryBean tentang kelas entitas Foo .

Kita bisa menentukan paket mana yang akan dicari kelas entitas di classpath:

sessionFactory.setPackagesToScan( new String[] { "com.baeldung.ex.mappingexception.persistence.model" });

Atau kita cukup mendaftarkan kelas entitas langsung ke Pabrik Sesi:

sessionFactory.setAnnotatedClasses(new Class[] { Foo.class });

Dengan salah satu dari baris konfigurasi tambahan ini, pengujian sekarang akan berjalan dengan benar dan lulus.

4. MappingException Dengan Hibernate

Sekarang mari kita lihat kesalahan saat hanya menggunakan Hibernate:

public class Cause4MappingExceptionIntegrationTest { @Test public void givenEntityIsPersisted_thenException() throws IOException { SessionFactory sessionFactory = configureSessionFactory(); Session session = sessionFactory.openSession(); session.beginTransaction(); session.saveOrUpdate(new Foo()); session.getTransaction().commit(); } private SessionFactory configureSessionFactory() throws IOException { Configuration configuration = new Configuration(); InputStream inputStream = this.getClass().getClassLoader(). getResourceAsStream("hibernate-mysql.properties"); Properties hibernateProperties = new Properties(); hibernateProperties.load(inputStream); configuration.setProperties(hibernateProperties); // configuration.addAnnotatedClass(Foo.class); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder(). applySettings(configuration.getProperties()).buildServiceRegistry(); SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); return sessionFactory; } }

File hibernate-mysql.properties berisi properti konfigurasi Hibernate :

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=jdbc:mysql://localhost:3306/spring_hibernate4_exceptions hibernate.show_sql=false hibernate.hbm2ddl.auto=create

Menjalankan pengujian ini akan menghasilkan pengecualian pemetaan yang sama:

org.hibernate.MappingException: Unknown entity: com.baeldung.ex.mappingexception.persistence.model.Foo at o.h.i.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1141)

Seperti yang mungkin sudah jelas dari contoh di atas, apa yang hilang dari konfigurasi adalah menambahkan metadata kelas entitas - Foo - ke konfigurasi :

configuration.addAnnotatedClass(Foo.class);

Ini memperbaiki pengujian - yang sekarang dapat mempertahankan entitas Foo.

5. Kesimpulan

Artikel ini mengilustrasikan mengapa Pengecualian Pemetaan Entitas Tidak Dikenal dapat terjadi, dan cara memperbaiki masalah saat itu terjadi, pertama di tingkat entitas, kemudian dengan Spring dan Hibernate dan terakhir, hanya dengan Hibernate saja.

Penerapan semua contoh pengecualian dapat ditemukan di proyek github - ini adalah proyek berbasis Eclipse, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.

Ketekunan bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya