java mysql hibernate hibernate-5.x

java - Hibernate 5:-org.hibernate.MappingException: entidad desconocida



mysql hibernate-5.x (6)

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

Esto parece ser un problema con hibernate5.0.0 y 5.0.1. Esto funciona bien con hibernate 4.3.9

Maven dependices

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

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


Asegúrese de haber creado el archivo de mapeo User.hbm.xml o User.xml e incluido ese archivo en hibernate.cfg.xml


En Hibernate 5, necesita compilar StandardServiceRegistry y Metadata para compilar SessionFactory . Puede usar el siguiente HibernateUtil para construir 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 está utilizando @Id como su estrategia de generación de identificador, entonces utilizando GenerationType.AUTO seleccionará el generador de identidad de "secuencia" de forma predeterminada con MySQL, que le dará las com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ''SampleDB.hibernate_sequence'' doesn''t exist excepción, si no la tiene configurada en sus entidades en los atributos de identificación. Entonces, con Hibernate 5, use GenerationType.IDENTITY lugar.


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

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

Reemplazar arriba por

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

Entonces funcionará bien ...


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 realiza configuration.buildSessionFactory(sr) , utilizando Hibernate 5, Configuration pierde toda la información sobre la asignación que se obtiene mediante la llamada 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 que no sea hibernate.properties , puede construir una fábrica de sesiones utilizando StandardServiceRegistryBuilder (de todos modos, si tiene hibernate.properties y otro archivo, se cargará 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 clase (raíz de la carpeta de fuentes, 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 utilizando este enfoque aquí fluent-hibernate-mysql . Utiliza una clase de utilidad para construir la fábrica de sesiones desde la biblioteca de hibernación fluida .

Tutorial incorrecto de Hibernate 5

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

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

No hace una configuración adecuada.


No agregaste un archivo de configuración

configuration.configure("/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();

resolvió el problema con Hibernate 5.2.10.Final.