Hibernate вызывает странную ошибку: класс не отображается
это ошибка
org.hibernate.hql.ast.QuerySyntaxException: Payment is not mapped [select p from Payment p]
Я не понимаю, как эта ошибка возникает, класс должен отображаться, как я покажу вам кратко. У меня очень простая конфигурация, такая как: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/ch01.html
Я попытался добавить определение отображения в файл hibernate.cfg.xml, и я также попытался добавить его программно. Ни один из них не работал. Может ли кто-нибудь сказать мне, что мне здесь не хватает? (это не первый раз, когда я собрал проект Hibernate)
это 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>
соединение с базой данных работает нормально, я тестировал, что
это статический инициализатор в моем 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);
}
}
и здесь я использую sessionFactory в классе 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;
}
это трассировка стека
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
Ответы
Ответ 1
Я ожидал бы одной из двух причин:
-
либо у вас нет Платежа, указанного в вашем файле hibernat.cfg.xml, или когда вы когда-либо настраиваете свои сопоставленные классы.
-
Другая причина может быть путаницей между javax... Entity и org.hibernate.... Entity. Убедитесь, что вы используете первый.
Ответ 2
Вместо
Query query = session.createQuery("select p from Payment p");
попробуйте это
Query query = session.createQuery("select p from " + Payment.class.getName() + " p");
Ответ 3
раскомментируйте код кода с комментариями в файле конфигурации hibernate.cfg.xml
<!-- <mapping class="com.lsyh.swati.zk.model.Payment"/> -->
change it to
<mapping class="com.lsyh.swati.zk.model.Payment"/>
для получения дополнительной информации см. эту ссылку
http://www.javabeat.net/tips/112-configure-mysql-database-with-hibernate-mappi.html
Ответ 4
Ваша сущность bean не регистрируется, я думаю.
Установите правильное имя корневого пакета вашего объекта beans в свойстве packagesToScan.
Также проверьте свой @Table (name= "name_of_your_table" ).
Ответ 5
Для меня мой класс не был указан в моем файле Persistence.xml в разделе класса.
Сделайте это, чтобы решить ish. или там, где перечислены ваши классы.
Ответ 6
Хотя принятый ответ правильный, хотел бы добавить контекст к первой части ответа.
Внутри вашего config.java(или того, что вы назвали файлом конфигурации приложения в пакетах), убедитесь, что вы правильно настроили сущностьScan:
package com.example.config;
import org.springframework.boot.autoconfigure.domain.EntityScan;
@EntityScan("com.example.entities")
Однако, если вам нравится, что наша команда перенесла ваши объекты в свои собственные пакеты, вы можете разрешить сканирование всех папок пакета:
@EntityScan("com.example.*")
Теперь, когда не все сущности находятся в папке сущностей специально.