Undtagelse til dvale-kortlægning - ukendt enhed

Udholdenhedstop

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Problemet

Denne artikel vil diskutere org.hibernate.MappingException: Ukendt enhed problem og løsninger, både i dvale såvel som i et forårsmiljø og dvale.

2. Mangler eller er ugyldig @Enhed Kommentar

Den mest almindelige årsag til kortlægningsundtagelsen er simpelthen en enhedsklasse mangler @Enhed kommentar:

offentlig klasse Foo implementerer Serializable {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat lang id; offentlig Foo () {super (); } offentlig lang getId () {return id; } public void setId (lang id) {this.id = id; }}

En anden mulighed er, at det kan have den forkerte type @Enhed kommentar:

import org.hibernate.annotations.Entity; @Entity offentlig klasse Foo implementerer Serializable {...

Den forældede org.hibernate.annotations.Entity er den forkerte type enhed at bruge - hvad vi har brug for er javax.persistence.Entity:

importere javax.persistence.Entity; @Entity offentlig klasse Foo implementerer Serializable {...

3. MappingException Med foråret

Konfigurationen af ​​dvale om foråret indebærer bootstrapping af SessionFactory fra annotationsscanning via en LocalSessionFactoryBean:

@Bean public LocalSessionFactoryBean sessionFactory () {LocalSessionFactoryBean sessionFactory = ny LocalSessionFactoryBean (); sessionFactory.setDataSource (restDataSource ()); ... retur sessionFabrik; }

Denne enkle konfiguration af Session Factory Bean mangler en nøgleingrediens og en test, der forsøger at bruge SessionFactory vil mislykkes:

... @Autowired privat SessionFactory sessionFactory; @Test (forventet = MappingException.class) @Transactional public void givenEntityIsPersisted_thenException () {sessionFactory.getCurrentSession (). SaveOrUpdate (new Foo ()); }

Undtagelsen er som forventet - MappingException: Ukendt enhed:

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

Nu er der to løsninger på dette problem - to måder at fortælle LocalSessionFactoryBean omkring Foo enhedsklasse.

Vi kan specificere hvilken pakker til at søge efter enhedsklasser i klassestien:

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

Eller vi kan simpelthen registrer enhedsklasser direkte ind i Sessionsfabrikken:

sessionFactory.setAnnotatedClasses (ny klasse [] {Foo.class});

Med en af ​​disse ekstra konfigurationslinjer kører testen nu korrekt og bestås.

4. MappingException Med dvale

Lad os nu se fejlen, når vi kun bruger dvale:

offentlig klasse Cause4MappingExceptionIntegrationTest {@Test offentlig ugyldighed givenEntityIsPersisted_thenException () kaster IOException {SessionFactory sessionFactory = configureSessionFactory (); Session session = sessionFactory.openSession (); session.beginTransaction (); session.saveOrUpdate (ny Foo ()); session.getTransaction (). commit (); } private SessionFactory configureSessionFactory () kaster IOException {Configuration configuration = new Configuration (); InputStream inputStream = this.getClass (). GetClassLoader (). getResourceAsStream ("hibernate-mysql.properties"); Egenskaber hibernateProperties = nye egenskaber (); hibernateProperties.load (inputStream); configuration.setProperties (hibernateProperties); // configuration.addAnnotatedClass (Foo.class); ServiceRegistry serviceRegistry = ny ServiceRegistryBuilder (). applySettings (configuration.getProperties ()). buildServiceRegistry (); SessionFactory sessionFactory = configuration.buildSessionFactory (serviceRegistry); retur sessionFabrik; }}

Det dvale-mysql.egenskaber filen indeholder egenskaberne for dvaletilstand:

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

At køre denne test resulterer i den samme kortlægningsundtagelse:

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

Da det sandsynligvis allerede fremgår af eksemplet ovenfor, er hvad der mangler i konfigurationen tilføje metadata for enhedsklassen - Foo - til konfigurationen:

configuration.addAnnotatedClass (Foo.class);

Dette løser testen - som nu er i stand til at fortsætte Foo-entiteten.

5. Konklusion

Denne artikel illustrerede, hvorfor den ukendte enhed Mapping Exception kan forekomme, og hvordan man løser problemet, når det sker, først på enhedsniveau, derefter med Spring og Dvaletilstand og endelig bare med Dvaletilstand alene.

Implementeringen af ​​alle eksempler på undtagelser findes i github-projektet - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.

Persistens bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN