Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate throws strange error: Class is not mapped

this is the error

org.hibernate.hql.ast.QuerySyntaxException: Payment is not mapped [select p from Payment p] 

I don't understand how come this error is thrown, the class should be mapped as I will show you briefly. I have a very basic config, like this one: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/ch01.html

I have tried to add the mapping definition into hibernate.cfg.xml and I have also tried to add it programmatically. Neither of them worked. Could anybody tell me what am I missing here? (it is not the first time I put together a Hibernate project)

this is the 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> 

the database connection is working fine, I have tested that

this is the static initializer in my 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);     } } 

and this is where I use the sessionFactory in the PaymentIODb class:

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

this is the stack trace

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 
like image 616
user1100478 Avatar asked Dec 15 '11 18:12

user1100478


2 Answers

I'd expect one of two things to be the reason:

  1. either you don't have Payment listed in your hibernat.cfg.xml or where ever you config your mapped classes.

  2. another reason might be the confusion between javax...Entity and org.hibernate....Entity. Make sure you use the first one.

like image 190
Jens Schauder Avatar answered Oct 24 '22 02:10

Jens Schauder


Instead of

Query query = session.createQuery("select p from Payment p"); 

try this

Query query = session.createQuery("select p from " + Payment.class.getName() + " p"); 
like image 30
mprabhat Avatar answered Oct 24 '22 02:10

mprabhat