java - ejemplos - Hibernate lanza un error extraño: la clase no está asignada
jpa ejemplos (6)
este es el error
org.hibernate.hql.ast.QuerySyntaxException: Payment is not mapped [select p from Payment p]
No entiendo por qué se produce este error, la clase debe asignarse, como lo mostraré brevemente. Tengo una configuración muy básica, como esta: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/ch01.html
He intentado agregar la definición de asignación en hibernate.cfg.xml y también he intentado agregarla mediante programación. Ninguno de ellos trabajó. ¿Alguien podría decirme qué me estoy perdiendo aquí? (no es la primera vez que armo un proyecto de Hibernate)
este es el hibernate.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="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/paymentsdatabase</property>
<property name="hibernate.connection.username">xxx</property>
<property name="hibernate.connection.password">xxx</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- <mapping class="com.lsyh.swati.zk.model.Payment"/> -->
</session-factory>
</hibernate-configuration>
La conexión de la base de datos está funcionando bien, he probado que
este es el inicializador estático en mi HibernateUtil
static {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml)
// config file.
sessionFactory = new AnnotationConfiguration()
.addPackage("com.lsyh.swati.zk.model")
.addAnnotatedClass(Payment.class)
.configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed. " + ex);
throw new ExceptionInInitializerError(ex);
}
}
y aquí es donde uso sessionFactory en la clase PaymentIODb:
public static List<Payment> readDataFromDb(){
StatelessSession session = StoreHibernateUtil.getSessionFactory().openStatelessSession();
Query query = session.createQuery("select p from Payment p");
List<Payment> payments = query.list();
session.close();
return payments;
}
esta es la traza de pila
org.hibernate.hql.ast.QuerySyntaxException: Payment is not mapped [select p from Payment p]
at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at com.lsyh.swati.zk.controller.PaymentIODb.readDataFromDb(PaymentIODb.java:35)
at com.lsyh.swati.zk.controller.PaymentIODb.resolveVariable(PaymentIODb.java:20
Aunque la respuesta aceptada es correcta, me gustaría agregar contexto a la primera parte de la respuesta.
Dentro de su config.java (o de lo que haya nombrado en su paquete de configuración de la aplicación), asegúrese de haber configurado correctamente su entityScan:
package com.example.config;
import org.springframework.boot.autoconfigure.domain.EntityScan;
@EntityScan("com.example.entities")
Sin embargo, si le gusta que nuestro equipo haya movido sus objetos a sus propios paquetes, puede permitir un análisis de todas las carpetas de paquetes:
@EntityScan("com.example.*")
Ahora que no todas las entidades están específicamente en la carpeta de entidades.
En lugar de
Query query = session.createQuery("select p from Payment p");
prueba esto
Query query = session.createQuery("select p from " + Payment.class.getName() + " p");
Espero que una de dos cosas sea la razón:
ya sea que no tiene el pago listado en su hibernat.cfg.xml o donde sea que configure sus clases asignadas.
otra razón podría ser la confusión entre javax ... Entity y org.hibernate .... Entity. Asegúrate de usar el primero.
Para mí, mi clase no se incluyó en mi archivo Persistence.xml en la sección de clase.
Hacer eso para resolver el ish. o dondequiera que se enumeren sus clases.
Su entidad bean no se está registrando, supongo. Establezca el nombre de paquete raíz correcto de sus beans de entidad en la propiedad packagesToScan. También verifique su @Table (name = "name_of_your_table").
elimine el comentario del código de asignación comentado en el archivo de configuración hibernate.cfg.xml
<!-- <mapping class="com.lsyh.swati.zk.model.Payment"/> -->
change it to
<mapping class="com.lsyh.swati.zk.model.Payment"/>
Para más información consulte este enlace.
http://www.javabeat.net/tips/112-configure-mysql-database-with-hibernate-mappi.html