Hibernate выдает странную ошибку: класс не отображается - PullRequest
26 голосов
/ 15 декабря 2011

это ошибка

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

Ответы [ 6 ]

30 голосов
/ 15 декабря 2011

Я ожидаю, что одна из двух причин будет причиной:

  1. , либо у вас нет Платежа, перечисленного в вашем hibernat.cfg.xml, или где вы когда-либо настраивали свой сопоставленныйклассы.

  2. другой причиной может быть путаница между javax ... Entity и org.hibernate .... Entity.Убедитесь, что вы используете первый.

28 голосов
/ 15 декабря 2011

Вместо

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

попробуйте это

Query query = session.createQuery("select p from " + Payment.class.getName() + " p");
3 голосов
/ 15 декабря 2011

раскомментируйте закомментированный код отображения в файле конфигурации 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

1 голос
/ 01 сентября 2017

Хотя принятый ответ правильный, хотелось бы добавить контекст к первой части ответа.

Внутри вашего config.java (или как вы называете файл конфигурации вашего приложения в пакетах), убедитесь, что вы правильно сконфигурировали ваш entityScan:

package com.example.config;

import org.springframework.boot.autoconfigure.domain.EntityScan;

@EntityScan("com.example.entities")

Однако, если вам нравится наша командапереместив ваши объекты в их собственные пакеты, вы можете разрешить сканирование всех папок пакетов:

@EntityScan("com.example.*")

Теперь, когда не все сущности находятся в папке сущностей специально.

1 голос
/ 22 октября 2013

Ваш бин сущности не регистрируется, я думаю. Установите правильное имя корневого пакета для ваших компонентов сущности в свойстве packagesToScan. Также проверьте свою @Table (name = "name_of_your_table").

0 голосов
/ 18 апреля 2017

Для меня мой класс не был указан в моем файле Persistence.xml в разделе классов.

Сделай это, чтобы решить иш. или там, где перечислены ваши классы.

...