Hibernate Mapping Exception - nepoznata cjelina
Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:
>> PROVJERITE TEČAJ1. 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