java - thread - unknown entity hibernate
org.hibernate.MappingException: entidad desconocida: anotaciones.Usuarios (16)
Agregue el siguiente código a hibernate.cfg.xml
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
Considera la jerarquía:
Y las siguientes clases y xml:
HibernateUtil.java
package annotations;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
/**
*
* @author X3
*
*/
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static final String HIBERNATE_CFG = "hibernateAnnotations.cfg.xml";
private static SessionFactory buildSessionFactory()
{
Configuration cfg = new Configuration().addResource(HIBERNATE_CFG).configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Users.java
package annotations;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.sql.Timestamp;
@Entity
@Table(name = "Users")
public class Users {
@Id
@GeneratedValue
@Column(name = "USER_ID")
private long userID;
@Column(name = "USERNAME", nullable = false, length = 100)
private String username;
@Column(name = "MessageTimeDate", nullable = false)
private java.sql.Timestamp datetime;
@Column(name = "UserMessage", nullable = false)
private String message;
public Users(String username , String message)
{
java.util.Date date = new java.util.Date();
this.datetime = new Timestamp(date.getTime());
this.username = username;
this.message = message;
}
public long getUserID() {
return userID;
}
public void setUserID(long userID) {
this.userID = userID;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public java.sql.Timestamp getDatetime() {
return datetime;
}
public void setDatetime(java.sql.Timestamp datetime) {
this.datetime = datetime;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Main.java
package annotations;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class Main {
public static void main(String[] args) {
try
{
SessionFactory sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
Users user1 = new Users("Jack" , "Hello");
session.save(user1);
session.getTransaction().commit();
session.close();
}
catch (Exception e)
{
System.out.println(e.toString());
e.getStackTrace();
}
}
}
Y hibernateAnnotations.cfg.xml
<?xml version=''1.0'' encoding=''utf-8''?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/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/CHAT_DB</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
<mapping class="annotations.Users"></mapping>
</session-factory>
</hibernate-configuration>
Cuando ejecuto main (), aparece el siguiente error en la ventana de resultados:
org.hibernate.MappingException: Unknown entity: annotations.Users
Pero la entidad Users
está en el paquete de annotations
, entonces, ¿qué pasa?
Agregue lo siguiente a su xml:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<value>annotations</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Compruebe que el nombre del paquete se proporciona en la propiedad packagesToScan en dispatcher-servlet.xml
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="**entity package name here**"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
</bean>
Cuando estaba intentando reescribir mi ejemplo (desde tutorialspoint) para usar anotaciones, obtuve la misma excepción. Esto me ayudó (addAnnotatedClass ()):
Configuration cfg=new Configuration();
cfg.addAnnotatedClass(com.tutorialspoint.hibernate.entity.Employee.class);
cfg.configure();
Defina la clase Entity
en Hibernate.cfg.xml
<mapping class="com.supernt.Department"/>
Al crear el objeto sessionFactory
Cargue el archivo de configuración Me gusta
SessionFactory factory = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();
El archivo de configuración de Hibernate debe definir las clases de entidad:
<mapping class="annotations.Users"/>
O debe agregar explícitamente la clase a la configuración usando
configuration.addClass(annotations.Users.class)
// Read mappings as a application resourceName
// addResource is for add hbml.xml files in case of declarative approach
configuration.addResource("myFile.hbm.xml"); // not hibernateAnnotations.cfg.xml
El problema ocurre debido a que la mapping class="annotations.Users"
entrada mapping class="annotations.Users"
en hibernate.cfg.xml
elimina esa línea, entonces funcionará.
Tuve el mismo problema. Cuando eliminé la línea anterior, funcionó bien para mí.
En lugar de usar HibernateUtil.java, para crear el objeto sessionfactory, debe usar esto:
SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
Porque para evitar la excepción, deberá declarar el objeto de la clase en el archivo HibernateUtil.java como configuration.addAnnotatedClass(Student_Info.class);
que parece tonto porque ya hemos proporcionado la entrada en el archivo hibernate.cfg.xml.
Para usar la clase AnnotationConfiguration, deberá agregar un jar a su ruta de compilación del proyecto: http://www.java2s.com/Code/Jar/h/Downloadhibernate353jar.htm
Estaba enfrentando el mismo problema y busqué durante casi 2 horas e intenté con diferentes formas posibles, como reemplazar los antiguos JAR de hibernación y cambiar el esquema de la tabla de base de datos. Pero finalmente obtuve la solución de la siguiente manera:
SessionFactory factory = new Configuration().configure().buildSessionFactory(); //This line to be replaced with below commented line
Reemplace arriba por
//Configuration config = new Configuration().configure();
//ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
//SessionFactory factory = config.buildSessionFactory(servReg);
Entonces funcionará bien ...
Estaba teniendo el mismo problema.
Utilice @javax.persistence.Entity
lugar de org.hibernate.annotations.Entity
Estaba teniendo un problema similar y agregando
sessionFactory.setAnnotatedClasses(User.class);
esta línea ayudó, pero antes de eso yo estaba teniendo
sessionFactory.setPackagesToScan(new String[] { "com.rg.spring.model" });
No estoy seguro de por qué esa no funciona. La clase de usuario está en com.rg.spring.model. Por favor, hágame saber cómo hacerlo funcionar a través del método packagesToScan.
Para quienes usan las clases de configuración Java de Spring, puede escribir lo siguiente:
@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) {
LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionBuilder.addProperties(getHibernateProperties());
sessionBuilder.addAnnotatedClasses(Foo.class);
sessionBuilder.addAnnotatedClasses(Bar.class);
sessionBuilder.addAnnotatedClasses(Bat.class);
return sessionBuilder.buildSessionFactory();
}
Si su entidad está mapeada a través de anotaciones, agregue el siguiente código a su configuración;
configuration.addAnnotatedClass(theEntityPackage.EntityClassName.class);
Por ejemplo;
configuration.addAnnotatedClass(com.foo.foo1.Products.class);
si su entidad está mapeada con un archivo xml, use addClass en lugar de addAnnotatedClass.
Como ejemplo;
configuration.addClass(com.foo.foo1.Products.class);
Hazme ping si necesitas más ayuda.
Use EntityScanner si puede soportar la dependencia externa. Inyectará todas sus clases de entidad sin problemas, incluso desde múltiples paquetes. Simplemente agregue la siguiente línea después de la configuración.
Configuration configuration = new Configuration().configure();
EntityScanner.scanPackages("com.fz.epms.db.model.entity").addTo(configuration);
// And following depencency if you are using Maven
<dependency>
<groupId>com.github.v-ladynev</groupId>
<artifactId>fluent-hibernate-core</artifactId>
<version>0.3.1</version>
</dependency>
De esta forma, no necesita declarar todas las entidades en el archivo de mapeo hibernate.
No encontré la respuesta aceptada útil para resolver la excepción encontrada en mi código. Y si bien no es técnicamente incorrecto, tampoco estaba satisfecho con las sugerencias de otros para introducir la redundancia:
- volver a agregar programáticamente la clase asignada mediante
configuration.addAnnotatedClass(...)
- crear un archivo
hbm.xml
y una asignación de recursos enhibernate_test.cfg.xml
que eran redundantes para las anotaciones existentes - escanee el paquete donde existe la clase (ya asignada) usando dependencias externas no mencionadas en la pregunta original
Sin embargo, encontré 2 soluciones posibles que quería compartir, y ambas resolvieron de forma independiente la excepción que encontré en mi propio código.
Estaba teniendo la misma MappingException
que @ron (usando una clase HibernateUtil
casi idéntica):
public final class HibernateUtil {
private static SessionFactory sessionFactory = null;
private static ServiceRegistry serviceRegistry = null;
private HibernateUtil() {}
public static synchronized SessionFactory getSessionFactory() {
if ( sessionFactory == null ) {
Configuration configuration = new Configuration().configure("hibernate_test.cfg.xml");
serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
sessionFactory = configuration.buildSessionFactory( serviceRegistry );
}
return sessionFactory;
}
// exception handling and closeSessionFactory() omitted for brevity
}
Dentro de mi archivo de configuración hibernate_test.cfg.xml
, tengo la asignación de clase requerida:
<mapping class="myPackage.Device"/>
Y mi clase de Device
está anotada correctamente con la anotación javax.persistence.Entity
:
package myPackage.core;
import javax.persistence.*;
@Entity
@Table( name = "devices" )
public class Device {
//body omitted for brevity
}
Dos posibles soluciones:
Primero , estoy usando Hibernate 5.2, y para aquellos que usan Hibernate 5, esta solución que usa un objeto Metadata
para construir una SessionFactory
debería funcionar. También parece ser el mecanismo de arranque nativo actualmente recomendado en la Guía de inicio de Hibernate :
public static synchronized SessionFactory getSessionFactory() {
if ( sessionFactory == null ) {
// exception handling omitted for brevity
serviceRegistry = new StandardServiceRegistryBuilder()
.configure("hibernate_test.cfg.xml")
.build();
sessionFactory = new MetadataSources( serviceRegistry )
.buildMetadata()
.buildSessionFactory();
}
return sessionFactory;
}
En segundo lugar , mientras que la Configuration
está semi-obsoleta en Hibernate 5 , @ron no dijo qué versión de Hibernate estaba usando, por lo que esta solución también podría ser valiosa para algunos.
Encontré un cambio muy sutil en el orden de las operaciones al crear instancias y configurar objetos de Configuration
y ServiceRegistry
para marcar la diferencia en mi propio código.
Orden original ( Configuration
creada y configurada antes de ServiceRegistry
):
public static synchronized SessionFactory getSessionFactory() {
if ( sessionFactory == null ) {
// exception handling omitted for brevity
Configuration configuration = new Configuration().configure("hibernate_test.cfg.xml");
serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings( configuration.getProperties() )
.build();
sessionFactory = configuration.buildSessionFactory( serviceRegistry );
}
return sessionFactory;
}
Nuevo pedido ( ServiceRegistry
creado y configurado antes de la Configuration
):
public static synchronized SessionFactory getSessionFactory() {
if ( sessionFactory == null ) {
// exception handling omitted for brevity
serviceRegistry = new StandardServiceRegistryBuilder()
.configure("hibernate_test.cfg.xml")
.build();
sessionFactory = new Configuration().buildSessionFactory( serviceRegistry );
}
return sessionFactory;
}
A riesgo de TLDR, también señalaré que con respecto a hibernate_test.cfg.xml
mi prueba sugiere que el método configuration.getProperties()
solo devuelve elementos <property />
, y los elementos <mapping />
están excluidos. Esto parece consistente con el uso específico de los términos ''propiedad'' y ''mapeo'' dentro de la documentación API para la Configuration
. Admitiré que este comportamiento puede tener algo que ver con la falla de applySettings()
para ceder los datos de mapeo al StandardServiceRegistryBuilder
. Sin embargo, esta información de mapeo ya debería haber sido analizada durante la configuración del objeto Configuration
y disponible cuando se buildSessionFactory()
. Por lo tanto, sospecho que esto puede deberse a los detalles específicos de la implementación con respecto a la prioridad de los recursos cuando se pasa un buildSessionFactory()
de buildSessionFactory()
método buildSessionFactory()
un objeto de buildSessionFactory()
.
Sé que esta pregunta tiene varios años, pero espero que esta respuesta le ahorre a alguien las horas de investigación que pasé derivando. ¡Aclamaciones!
public static void main(String[] args) {
try{
// factory = new Configuration().configure().buildSessionFactory();
factory = new AnnotationConfiguration().
configure().
//addPackage("com.xyz") //add package if used.
addAnnotatedClass(Employee.class).
buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}//you can write like this in your test class inside main method.this way you will be able to do the things using annotaions only