2015-10-08 1 views
1

Le code suivant fonctionne très bien avec Hibernate 4.3, mais lorsque je tente le même code en utilisant Hibernate 5.0 il en résulte l'erreur suivante:5: org.hibernate.MappingException: entité inconnue

Exception in thread "main" org.hibernate.MappingException: Unknown entity: entity.Message 
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776) 
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1451) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:100) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:678) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:670) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:665) 
    at client.Main.main(Main.java:14) 

Quelqu'un pourrait-il Aidez-moi à comprendre pourquoi cela se passe-t-il?


Voici le code utilisé pour tester l'exemple:

Main.java

package client; 
import org.hibernate.Session; 
import util.HibernateUtil; 
import entity.Message; 

public class Main { 
    public static void main(String[] args) {   
     Session session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 

     Message message = new Message("Hello Hibernate 5"); 

     session.save(message);  

     session.getTransaction().commit(); 
     session.close();  
    } 
} 

HibernateUtil.java

package util; 
import org.hibernate.SessionFactory; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.cfg.Configuration; 

public class HibernateUtil {  
    private static final SessionFactory sessionFactory = buildSessionFactory();  
    private static SessionFactory buildSessionFactory() { 
     try {   
      Configuration configuration = new Configuration().configure("hibernate.cfg.xml");  
      return configuration.buildSessionFactory(new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build()); 
     } 
     catch (Throwable ex) {     
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 

Message.java

package entity; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="message") 
public class Message { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="ID") 
    private Long id; 

    @Column(name="TEXT")  
    private String text; 

    public Message() {} 
    public Message(String text) { 
     this.text = text; 
    } 
} 

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 

     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://localhost:3306/hello</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password">pass</property> 

     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

     <mapping class="entity.Message"/> 

    </session-factory> 
</hibernate-configuration> 

Schéma SQL de base de données (RDBMS MYSQL)

CREATE DATABASE `hello`; 
USE `hello`; 
CREATE TABLE `message` (
`ID` BIGINT(20) NOT NULL AUTO_INCREMENT, 
`TEXT` VARCHAR(255) NULL DEFAULT NULL, 
PRIMARY KEY (`ID`) 
); 
+0

ce qui est la structure de votre répertoire –

+0

@JunedAhsan: une Projet Java dans Eclipse IDE avec 'src' étant le dossier source dans le classpath. 'hibernate.cfg.xml' est juste sous le dossier' src'. 'Main.java' se trouve dans le paquet' client', 'HibernateUtil.java' dans le paquet' util' et 'Message.java' dans le paquet' entity'. – skip

+0

Je pense que c'est parce que vous n'avez pas configuré une propriété de schéma par défaut dans votre fichier hibernate-cfg.xml. Laissez-moi jeter un oeil, et je serai de retour avec la réponse – javaguest

Répondre

11

mise à jour: Dans Hibernate 5.0 .x, la configuration avec le registre de service standard est dépréciée

Au lieu de cela, vous devez amorcer avec métadonnées:

Dans votre classe HibernateUtil, vous devez ajouter

private static SessionFactory buildSessionFactory() { 
    try {   
     StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() 
     .configure("hibernate.cfg.xml") 
     .build(); 

     Metadata metadata = new MetadataSources(standardRegistry) 
     .getMetadataBuilder() 
     .build(); 

     return metadata.getSessionFactoryBuilder().build(); 

    } 

Et comme une note de côté, changer la déclaration d'identité de votre classe de message à

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="ID") 
private Long id; 

Donc, hibernate peut pro utiliser automatiquement l'incrément automatique de mySql, sinon il lèvera une exception.

+0

Cela ne fait aucune différence. Je continue à avoir la même erreur. – skip

+0

ok, je mets en place un nouveau projet pour le déboguer, utilisez-vous maven? – javaguest

+0

pour ne pas ressembler à un âne, mais j'ai recréé votre projet en éclipse et cela a parfaitement fonctionné. Je l'ai partagé sur github: https://github.com/bruno-cw/pizzadepot/tree/master/Hibernate si vous pouviez partager le vôtre, ce serait une aide précieuse pour identifier ce qui ne va pas. J'ai exclu tout problème avec db, – javaguest

0

Sinon, vous pouvez effectuer les opérations suivantes dans Hibernate 5+ et votre SessionFactory/Session créer la classe extend la classe HibernateHelper ci-dessous:

package com.company.hibernatehelper;

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class HibernateHelper { 
    private static SessionFactory sessionFactory = null; 

    public static SessionFactory getSessionFactory() { 
     if(sessionFactory == null) { 
     sessionFactory = new Configuration().configure().buildSessionFactory(); 
     } 
     return sessionFactory; 
    } 
}