Ausnahme für die Zuordnung im Ruhezustand - Unbekannte Entität

Ausdauer oben

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Das Problem

In diesem Artikel wird das org.hibernate.MappingException : Unbekanntes Entitätsproblem und Lösungen sowohl für den Ruhezustand als auch für eine Spring- und Hibernate-Umgebung erläutert .

2. Fehlende oder ungültige @ Entity- Anmerkung

Die häufigste Ursache für die Zuordnungsausnahme ist einfach eine Entitätsklasse, der die Annotation @Entity fehlt :

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; } }

Eine andere Möglichkeit besteht darin, dass die falsche Art der @ Entity- Annotation vorhanden ist :

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

Die veraltete org.hibernate.annotations.Entity ist der falsche Entitätstyp - was wir brauchen, ist die javax.persistence.Entity :

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

3. MappingException With Spring

Bei der Konfiguration von Hibernate in Spring wird die SessionFactory über eine LocalSessionFactoryBean vom Anmerkungsscan gebootet :

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

Bei dieser einfachen Konfiguration der Session Factory Bean fehlt eine wichtige Zutat, und ein Test, bei dem versucht wird, die SessionFactory zu verwenden, schlägt fehl:

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

Die Ausnahme ist erwartungsgemäß die MappingException: Unbekannte Entität :

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

Jetzt gibt es zwei Lösungen für dieses Problem - zwei Möglichkeiten, die LocalSessionFactoryBean über die Foo- Entitätsklasse zu informieren .

Wir können angeben, welche Pakete im Klassenpfad nach Entitätsklassen suchen sollen :

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

Oder wir können die Entitätsklassen einfach direkt in der Session Factory registrieren :

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

Mit einer dieser zusätzlichen Konfigurationszeilen wird der Test nun korrekt ausgeführt und bestanden.

4. MappingException With Hibernate

Lassen Sie uns nun den Fehler sehen, wenn Sie nur den Ruhezustand verwenden:

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; } }

Die Datei hibernate-mysql.properties enthält die Konfigurationseigenschaften für den Ruhezustand :

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

Das Ausführen dieses Tests führt zu derselben Zuordnungsausnahme:

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

Wie aus dem obigen Beispiel wahrscheinlich bereits hervorgeht, fehlen in der Konfiguration die Metadaten der Entitätsklasse Foo zur Konfiguration :

configuration.addAnnotatedClass(Foo.class);

Dies behebt den Test, der nun die Foo-Entität beibehalten kann.

5. Schlussfolgerung

In diesem Artikel wurde erläutert, warum die Ausnahme für die Zuordnung unbekannter Entitäten auftreten kann und wie das Problem behoben werden kann, wenn dies zuerst auf Entitätsebene, dann mit Spring und Hibernate und schließlich nur mit Hibernate allein geschieht.

Die Implementierung aller Ausnahmebeispiele finden Sie im Github-Projekt - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.

Persistenz unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs