web-dev-qa-db-fra.com

Hibernate 5: - org.hibernate.MappingException: entité inconnue

Je reçois le message d'erreur org.hibernate.MappingException: Unknown entity lorsque j'essaie d'intégrer hibernate 5.0 à mysql

Cela semble être un problème avec hibernate5.0.0 et 5.0.1. Cela fonctionne très bien avec Hibernate 4.3.9

Dépendances Maven

<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

J'ai résolu le même problème avec Hibernate 5. Il y a un problème dans ce code

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

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

SessionFactory sf = configuration.buildSessionFactory(sr);

Ce code fonctionne bien pour Hibernate 4.3.5, mais le même code a le même problème pour Hibernate 5. 

Quand vous faites configuration.buildSessionFactory(sr), en utilisant Hibernate 5, Configuration perd toutes les informations sur le mappage obtenu par appel configuration.configure().

Solution

Pour résoudre le problème, si vous utilisez les fichiers de configuration standard hibernate.cfg.xml et hibernate.properties, vous pouvez créer la fabrique de sessions de cette manière (sans ServiceRegistry). 

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

Chargement des propriétés

Si vous avez des propriétés dans un fichier autre que hibernate.properties, vous pouvez créer une fabrique de session en utilisant StandardServiceRegistryBuilder (de toute façon, si vous avez hibernate.properties et un autre fichier, il sera chargé à la fois)

Pour charger des propriétés en tant que ressource

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

Vous devez avoir hibernate-h2.properties dans le chemin de classe (racine du dossier sources, dossier resources). Vous pouvez également spécifier un chemin à partir du dossier source racine /com/github/xxx/model/hibernate-h2.properties.

Pour charger des propriétés à partir d'un chemin dans le système de fichiers

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

Vous pouvez trouver un exemple d'application console utilisant cette approche ici fluent-hibernate-mysql . Il utilise une classe d’utilitaires pour construire la fabrique de sessions à partir de la bibliothèque fluent-hibernate

Didacticiel Hibernate 5 incorrect

Il existe un exemple incorrect dans le tutoriel Hibernate 5 1.1.6. Startup et aides . Il utilise ce code

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

Il ne fait pas une configuration appropriée.

25
v.ladynev

Dans Hibernate 5, vous devez compiler StandardServiceRegistry et Metadata pour compiler SessionFactory. Vous pouvez utiliser la HibernateUtil suivante pour construire SessionFactory. hibernate.cfg.xml devrait être à la racine du classpath de votre application.

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

}

De plus, si vous utilisez Hibernate 5 et utilisez @Id comme stratégie de génération d'identifiant, utilisez GenerationType.AUTO pour récupérer le générateur d'identité "séquence" par défaut avec MySQL, ce qui vous donnera une exception com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't exist, si vous ne l'avez pas. configuré dans vos entités aux attributs d'identifiant. Donc, avec Hibernate 5, utilisez plutôt GenerationType.IDENTITY.

6
skip

Assurez-vous que vous avez créé le fichier de mappage User.hbm.xml ou le fichier User.xml et inclus ce fichier dans hibernate.cfg.xml. 

0
Chetan chadha

En utilisant ceci:

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

Session session = sessionFactory.openSession();

au lieu de cela:

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

Session session = factory.openSession();

résolu le problème avec Hibernate 5.2.10.Final.

0
zygimantus

Vous n'avez pas ajouté de fichier de configuration

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

Je faisais face au même problème et j'ai cherché pendant près de 2 heures et essayé de différentes manières, comme le remplacement de vieux bocaux en veille prolongée et la modification du schéma de la table db. Mais finalement obtenu la solution comme ci-dessous;

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

Remplacer ci-dessus pour

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

Cela fonctionnera alors très bien ..

0
JR Sahoo.'JS'