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.