Hibernate Mapping Exception - nepoznata cjelina

Vrh postojanosti

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Problem

Ovaj članak će raspravljati o org.hibernate.MappingException: Nepoznati entitet izdanja i rješenja, kako za hibernaciju, tako i za proljeće i hibernaciju.

2. Nedostaje ili je nevaljano @ Entitet Bilješka

Najčešći uzrok iznimke mapiranja jednostavno je klasa entiteta nedostaje @ Entitet bilješka:

javna klasa Foo implementira Serializable {@Id @GeneratedValue (strategy = GenerationType.AUTO) private long id; javni Foo () {super (); } public long getId () {return id; } javna praznina setId (dugi id) {this.id = id; }}

Druga je mogućnost da možda ima pogrešan tip @ Entitet bilješka:

import org.hibernate.annotations.Entity; @Entity javna klasa Foo implementira Serializable {...

Zastarjelo org.hibernate.notacije.Entitet je pogrešna vrsta entiteta za upotrebu - što trebamo je javax.postojanost.Entitet:

import javax.persistence.Entity; @Entity javna klasa Foo implementira Serializable {...

3. MappingException S proljećem

Konfiguracija Hibernate u proljeće uključuje bootstrapping SjednicaTvornica od skeniranja bilješki, putem a LocalSessionFactoryBean:

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

Ovoj jednostavnoj konfiguraciji Session Factory Bean nedostaje ključni sastojak i test koji pokušava koristiti SjednicaTvornica neće uspjeti:

... @Autowired private SessionFactory sessionFactory; @Test (očekuje se = MappingException.class) @Transactional javna praznina givenEntityIsPersisted_thenException () {sessionFactory.getCurrentSession (). SaveOrUpdate (new Foo ()); }

Iznimka je, kako se očekivalo, MappingException: Nepoznati entitet:

org.hibernate.MappingException: Nepoznati entitet: com.baeldung.ex.mappingexception.persistence.model.Foo na o.h.i.SessionFactoryImpl.getEntityPersister (SessionFactoryImpl.java:1141)

Sada postoje dva rješenja za ovaj problem - dva načina za kazivanje LocalSessionFactoryBean o Foo klasa entiteta.

Možemo odrediti koji paketi za traženje klasa entiteta u stazi:

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

Ili možemo jednostavno registrirajte izravno entitetne klase u tvornicu sesija:

sessionFactory.setAnnotatedClasses (nova klasa [] {Foo.class});

S bilo kojom od ovih dodatnih konfiguracijskih linija test će se sada pravilno pokrenuti i proći.

4. MappingException Uz hibernaciju

Pogledajmo sada pogrešku pri korištenju samo hibernacije:

javna klasa Cause4MappingExceptionIntegrationTest {@Test javna praznina givenEntityIsPersisted_thenException () baca IOException {SessionFactory sessionFactory = configureSessionFactory (); Sjednica sesije = sessionFactory.openSession (); session.beginTransaction (); session.saveOrUpdate (novi Foo ()); session.getTransaction (). commit (); } private SessionFactory configureSessionFactory () baca IOException {Configuration configuration = new Configuration (); InputStream inputStream = this.getClass (). GetClassLoader (). getResourceAsStream ("hibernate-mysql.properties"); Svojstva hibernateProperties = new Svojstva (); hibernateProperties.load (inputStream); configuration.setProperties (hibernateProperties); // configuration.addAnnotatedClass (Foo.class); ServiceRegistry serviceRegistry = novi ServiceRegistryBuilder (). applySettings (configuration.getProperties ()). buildServiceRegistry (); SessionFactory sessionFactory = configuration.buildSessionFactory (serviceRegistry); return sessionFactory; }}

The hibernate-mysql.svojstva datoteka sadrži konfiguracijska svojstva hibernacije:

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

Izvođenje ovog testa rezultirat će istom izuzećem preslikavanja:

org.hibernate.MappingException: Nepoznati entitet: com.baeldung.ex.mappingexception.persistence.model.Foo na o.h.i.SessionFactoryImpl.getEntityPersister (SessionFactoryImpl.java:1141)

Kao što je vjerojatno već jasno iz gornjeg primjera, ono što nedostaje konfiguraciji jest dodavanje metapodataka klase entiteta - Foo - na konfiguraciju:

configuration.addAnnotatedClass (Foo.class);

Ovo popravlja test - koji je sada u stanju zadržati Foo entitet.

5. Zaključak

Ovaj je članak ilustrirao zašto se može dogoditi izuzetak mapiranja nepoznatog entiteta i kako riješiti problem kada se to dogodi, prvo na razini entiteta, zatim s Proljećem i hibernacijom i na kraju, samo s Hibernateom

Primjenu svih primjera iznimki možete pronaći u projektu github - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.

Dno postojanosti

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ