Hibernate 5: – org.hibernate.MappingException: entidad desconocida

Recibo el mensaje de error org.hibernate.MappingException: Unknown entity cuando bash integrar hibernate 5.0 con mysql

Esto parece ser un problema con hibernate5.0.0 y 5.0.1. Esto funciona bien con hibernación 4.3.9

Maven depende

  org.hibernate hibernate-core 5.0.0.Final   mysql mysql-connector-java 5.1.36  

hibernate.cfg.xml

   com.mysql.jdbc.Driver jdbc:mysql://localhost:3307/SampleDB  root   1 org.hibernate.dialect.MySQLDialect  true  create   

Código HibernateMain.java

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

He solucionado el mismo problema con Hibernate 5. Hay un problema en este código

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

Este código funciona bien para Hibernate 4.3.5, pero el mismo código tiene el mismo problema para Hibernate 5.

Cuando hace configuration.buildSessionFactory(sr) , usando Hibernate 5, Configuration pierde toda la información sobre la asignación que obtiene por llamada a configuration.configure() .

Solución

Para solucionar el problema, si utiliza los archivos de configuración estándar hibernate.cfg.xml e hibernate.properties , puede crear la fábrica de sesiones de esta manera (sin ServiceRegistry )

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

Cargando propiedades

Si tiene propiedades en un archivo distinto de hibernate.properties , puede construir la fábrica de sesiones utilizando StandardServiceRegistryBuilder (de todos modos, si tiene hibernate.properties y otro archivo, se cargarán ambos)

Para cargar propiedades como un recurso

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

hibernate-h2.properties tener hibernate-h2.properties en la ruta de la clase (raíz de la carpeta de fonts, carpeta de recursos). También puede especificar una ruta desde la carpeta de origen raíz /com/github/xxx/model/hibernate-h2.properties .

Para cargar propiedades desde una ruta en el sistema de archivos

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

Puede encontrar una aplicación de consola de ejemplo usando este enfoque aquí fluent-hibernate-mysql . Utiliza una clase de utilidad para construir la fábrica de sesiones desde la biblioteca fluent-hibernate .

Tutorial incorrecto de Hibernate 5

Hay un ejemplo incorrecto en Hibernate 5 tutorial 1.1.6. Inicio y ayudantes . Utiliza este código

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

No hace una configuración adecuada.

En Hibernate 5, debe comstackr StandardServiceRegistry y Metadata para comstackr SessionFactory . Puede usar la siguiente HibernateUtil para comstackr SessionFactory . hibernate.cfg.xml debe estar en la raíz del classpath de su aplicación.

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

Además, si está utilizando Hibernate 5 y usa @Id como estrategia de generación de identificador, entonces usar GenerationType.AUTO recogerá el generador de identidad de “secuencia” por defecto con MySQL, que le proporcionará una com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't exist , si no la tiene configurada en sus entidades en los atributos del identificador. Entonces con Hibernate 5, use GenerationType.IDENTITY lugar.

No agregaste un archivo de configuración

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

Asegúrese de haber creado el archivo de asignación User.hbm.xml o User.xml e incluir ese archivo en hibernate.cfg.xml

Usando esto:

 SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class); Session session = sessionFactory.openSession(); 

en lugar de esto:

 SessionFactory factory = new Configuration().configure().buildSessionFactory(); Session session = factory.openSession(); 

resuelto el problema con Hibernate 5.2.10.Final.

Estaba enfrentando el mismo problema y busqué durante casi 2 horas y probé con diferentes formas posibles, como reemplazar los viejos flasks de hibernación y cambiar el esquema de la tabla db. Pero finalmente obtuve la solución siguiente;

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

Reemplace arriba por

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

Entonces funcionará bien …