webentwicklung-frage-antwort-db.com.de

Ruhezustand 5: - org.hibernate.MappingException: Unbekannte Entität

Ich erhalte die Fehlermeldung org.hibernate.MappingException: Unknown entity, wenn ich versuche, Hibernate 5.0 mit MySQL zu integrieren

Dies scheint ein Problem mit Hibernate5.0.0 und 5.0.1 zu sein. Dies funktioniert gut mit Hibernate 4.3.9

Maven-Wächter

<dependency>
    <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.0.Final</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-Java</artifactId>
        <version>5.1.36</version>
</dependency>

hibernate.cfg.xml

<session-factory>

    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3307/SampleDB
    </property>
    <property name="connection.username">root</property>
    <property name="connection.password"></property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">create</property>

    <mapping class="UserA.User"></mapping>

</session-factory>

HibernateMain.Java-Code

package UserA;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.mapping.Map;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.service.ServiceRegistry;

public class HibernateMain {

    public static void main(String[] args) {

        Configuration configuration = new Configuration();
        configuration.configure();
        ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

        SessionFactory sf = configuration.buildSessionFactory(sr);




        User user1 = new User();
        user1.setUserName("Arpit");
        user1.setUserMessage("Hello world from arpit");
        user1.setUserId(22);

        Session ss = sf.openSession();
        ss.beginTransaction();
        // saving objects to session
        ss.save(user1);
        ss.getTransaction().commit();
        ss.close();

    }

}

User.Java

package UserA;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity(name="User_table")
public class User {
    @Id
    int userId;
    @Column(name = "User_Name")
    String userName;

    @Column(name = "User_Message")
    String userMessage;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserMessage() {
        return userMessage;
    }

    public void setUserMessage(String userMessage) {
        this.userMessage = userMessage;
    }

}
14
Mamta Garg

Ich habe das gleiche Problem mit Hibernate 5 behoben. In diesem Code liegt ein Problem vor

Configuration configuration = new Configuration();
configuration.configure();

ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(
    configuration.getProperties()).build();

SessionFactory sf = configuration.buildSessionFactory(sr);

Dieser Code funktioniert gut für Hibernate 4.3.5, aber derselbe Code hat das gleiche Problem für Hibernate 5. 

Wenn Sie configuration.buildSessionFactory(sr) mit Hibernate 5 ausführen, geht Configuration alle Informationen über das Mapping verloren, die mit dem Aufruf configuration.configure() abgerufen werden.

Lösung

Wenn Sie die Standardkonfigurationsdateien hibernate.cfg.xml und hibernate.properties verwenden, können Sie die Sitzungsfactory auf diese Weise (ohne ServiceRegistry) erstellen, um das Problem zu beheben. 

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

Eigenschaften laden

Wenn Sie Eigenschaften in einer anderen Datei als hibernate.properties haben, können Sie mithilfe von StandardServiceRegistryBuilder eine Sitzungsfactory erstellen (wenn Sie hibernate.properties und andere Dateien haben, werden beide geladen).

Eigenschaften als Ressource laden

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
    configure().loadProperties("hibernate-h2.properties").build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);  

Sie benötigen hibernate-h2.properties im Klassenpfad (Stammverzeichnis des Quellenordners, Ressourcenordner). Sie können auch einen Pfad aus dem Stammquellordner angeben /com/github/xxx/model/hibernate-h2.properties.

Um Eigenschaften aus einem Pfad im Dateisystem zu laden

File propertiesPath = new File("some_path");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
    configure().loadProperties(propertiesPath).build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);

Eine Beispielkonsolenanwendung, die diesen Ansatz verwendet, finden Sie hier fluent-hibernate-mysql . Es verwendet eine Dienstprogrammklasse, um die Session Factory aus der fluent-hibernate-Bibliothek zu erstellen. 

Falscher Hibernate 5 Tutorial

Es gibt ein falsches Beispiel in Hibernate 5-Tutorial 1.1.6. Startup und Helfer . Es verwendet diesen Code

 return new Configuration().configure().buildSessionFactory(
                new StandardServiceRegistryBuilder().build() );

Es führt keine korrekte Konfiguration durch.

25
v.ladynev

In Hibernate 5 müssen Sie StandardServiceRegistry und Metadata erstellen, um SessionFactory zu erstellen. Sie können die folgende HibernateUtil verwenden, um SessionFactory zu erstellen. hibernate.cfg.xml sollte sich im Stammverzeichnis des Klassenpfads Ihrer Anwendung befinden.

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml").build();
            Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build();
            return metadata.getSessionFactoryBuilder().build();
        } 
        catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

Wenn Sie Hibernate 5 verwenden und @Id als Identifizierungsstrategie für Bezeichner verwenden, wird bei Verwendung von GenerationType.AUTO der Identitätsgenerator "sequence" standardmäßig mit MySQL abgerufen, der Ihnen die Ausnahme com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't exist gibt, wenn Sie keine haben in Ihren Entitäten unter Bezeichnerattributen konfiguriert. Verwenden Sie bei Hibernate 5 stattdessen GenerationType.IDENTITY.

6
skip

Stellen Sie sicher, dass Sie die Zuordnungsdatei User.hbm.xml oder User.xml erstellt und diese Datei in hibernate.cfg.xml eingefügt haben 

0
Chetan chadha

Mit diesem:

SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

Session session = sessionFactory.openSession();

an Stelle von:

SessionFactory factory = new Configuration().configure().buildSessionFactory();

Session session = factory.openSession();

behebt das Problem mit Hibernate 5.2.10.Final.

0
zygimantus

Sie haben keine Konfigurationsdatei hinzugefügt

configuration.configure("/hibernate.cfg.xml");
0
user2173738

Ich war mit dem gleichen Problem konfrontiert und suchte fast zwei Stunden lang und versuchte es mit verschiedenen Möglichkeiten, wie dem Ersetzen alter Hibernat-Gläser und dem Ändern des DB-Tabellenschemas. Aber endlich die Lösung wie unten;

 //This line to be replaced with below commented line
 SessionFactory factory = new Configuration().configure().buildSessionFactory();

Ersetzen Sie oben für

Configuration config = new Configuration().configure();
ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory factory = config.buildSessionFactory(servReg);

Es wird dann gut funktionieren ..

0
JR Sahoo.'JS'