Pengecualian Pemetaan Hibernate - Entiti Tidak Dikenal

Ketekunan atas

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

>> SEMAK KURSUS

1. Masalahnya

Artikel ini akan membincangkan org.hibernate.MappingException : Masalah dan penyelesaian entiti yang tidak diketahui , baik untuk Hibernate dan juga untuk persekitaran Spring dan Hibernate.

2. Anotasi @Entity Tidak Ada atau Tidak Sah

Sebab yang paling biasa untuk pengecualian pemetaan hanyalah kelas entiti yang tidak mempunyai anotasi @Entity :

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 bahawa ia mungkin mempunyai jenis anotasi @Entity yang salah :

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

Organ.hibernate.annotations.Entity yang tidak digunakan adalah jenis entiti yang salah untuk digunakan - apa yang kita perlukan adalah javax.persistence.Entity :

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

3. PemetaanException Dengan Musim Bunga

Konfigurasi Hibernate di Spring melibatkan bootstrapping SessionFactory dari pengimbasan anotasi, melalui LocalSessionFactoryBean :

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

Konfigurasi ringkas dari Session Factory Bean ini tidak mempunyai unsur utama, dan ujian yang cuba menggunakan SessionFactory akan gagal:

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

Pengecualian adalah, seperti yang dijangkakan - MappingException: Entiti 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 penyelesaian untuk masalah ini - dua cara untuk memberitahu LocalSessionFactoryBean mengenai kelas entiti Foo .

Kami dapat menentukan pakej mana yang akan dicari untuk kelas entiti di classpath:

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

Atau kita boleh mendaftarkan kelas entiti terus ke Session Factory:

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

Dengan salah satu baris konfigurasi tambahan ini, ujian kini akan berjalan dengan betul dan lulus.

4. PemetaanException Dengan Hibernate

Sekarang mari kita lihat ralat ketika 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; } }

The hibernate-mysql.properties fail mengandungi sifat-sifat 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 ujian 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 sudah jelas dari contoh di atas, apa yang hilang dari konfigurasi adalah menambahkan metadata kelas entiti - Foo - ke konfigurasi :

configuration.addAnnotatedClass(Foo.class);

Ini memperbaiki ujian - yang kini dapat bertahan dengan entiti Foo.

5. Kesimpulan

Artikel ini menggambarkan mengapa Pengecualian Pemetaan entiti Tidak Dikenal mungkin berlaku, dan bagaimana menyelesaikan masalah ketika berlaku, pertama di peringkat entiti, kemudian dengan Musim Semi dan Hibernate dan akhirnya, hanya dengan Hibernate sahaja.

Pelaksanaan semua contoh pengecualian boleh didapati di projek github - ini adalah projek berasaskan Eclipse, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.

Ketekunan bawah

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

>> SEMAK KURSUS