Unntak for dvalemodus - Ukjent enhet

Utholdenhetstopp

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Problemet

Denne artikkelen skal diskutere org.hibernate.MappingException: Ukjent enhet problem og løsninger, både for dvalemodus så vel som for et vår- og dvalemiljø.

2. Mangler eller er ugyldig @Enhet Kommentar

Den vanligste årsaken til kartleggings unntaket er ganske enkelt en enhetsklasse mangler @Enhet kommentar:

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

En annen mulighet er at det kan ha feil type @Enhet kommentar:

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

Den utfasede org.hibernate.annotations.Entity er feil type enhet å bruke - hva vi trenger er javax.persistence.Entity:

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

3. MappingException Med våren

Konfigurasjonen av Hibernate in Spring innebærer bootstrapping av SessionFactory fra merkeskanning, via en LocalSessionFactoryBean:

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

Denne enkle konfigurasjonen av Session Factory Bean mangler en viktig ingrediens, og en test som prøver å bruke SessionFactory vil mislykkes:

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

Unntaket er, som forventet - MappingException: Ukjent enhet:

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

Nå er det to løsninger på dette problemet - to måter å fortelle LocalSessionFactoryBean om Foo enhetsklasse.

Vi kan spesifisere hvilken pakker for å søke etter enhetsklasser i klassestien:

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

Eller vi kan rett og slett registrer enhetsklassene direkte inn i sesjonsfabrikken:

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

Med en av disse tilleggskonfigurasjonslinjene vil testen nå kjøre riktig og bestå.

4. MappingException Med dvalemodus

La oss nå se feilen når du bare bruker dvalemodus:

public class Cause4MappingExceptionIntegrationTest {@Test public void givenEntityIsPersisted_thenException () kaster IOException {SessionFactory sessionFactory = configureSessionFactory (); Sessionsøkt = 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"); Egenskaper hibernateProperties = nye egenskaper (); hibernateProperties.load (inputStream); configuration.setProperties (hibernateProperties); // configuration.addAnnotatedClass (Foo.class); ServiceRegistry serviceRegistry = ny ServiceRegistryBuilder (). applySettings (configuration.getProperties ()). buildServiceRegistry (); SessionFactory sessionFactory = configuration.buildSessionFactory (serviceRegistry); returøktFabrikk; }}

De dvale-mysql.egenskaper filen inneholder dvalemodus-konfigurasjonsegenskapene:

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

Å kjøre denne testen vil føre til samme kartleggings unntak:

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

Som det sannsynligvis allerede er klart fra eksemplet ovenfor, er det som mangler i konfigurasjonen legge til metadata for enhetsklassen - Foo - til konfigurasjonen:

configuration.addAnnotatedClass (Foo.class);

Dette løser testen - som nå er i stand til å vedvare Foo-enheten.

5. Konklusjon

Denne artikkelen illustrerte hvorfor Unknown Mapping Exception kan oppstå, og hvordan du løser problemet når det skjer, først på enhetsnivå, deretter med Spring og Hibernate og til slutt, bare med Hibernate alene.

Implementeringen av alle eksempler på unntak finnes i github-prosjektet - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.

Persistensbunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

$config[zx-auto] not found$config[zx-overlay] not found