Hibernate抛出奇怪的错误:未映射类

时间:2021-09-02 23:03:25

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

我不明白为什么会抛出这个错误,应该映射类,因为我会简要地向您展示。我有一个非常基本的配置,如下所示: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)

我试图将映射定义添加到hibernate.cfg.xml中,我也尝试以编程方式添加它。他们都没有工作。谁能告诉我在这里我错过了什么? (这不是我第一次组建一个Hibernate项目)

this is the hibernate.cfg.xml

这是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

这是我的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:

这是我在PaymentIODb类中使用sessionFactory的地方:

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

6 个解决方案

#1


28  

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.

    要么您没有在hibernat.cfg.xml中列出付款,要么在您配置映射类的位置。

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

    另一个原因可能是javax之间的混淆......实体和org.hibernate ....实体。确保使用第一个。

#2


26  

Instead of

代替

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

try this

尝试这个

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

#3


2  

uncomment the commented mapping code in hibernate.cfg.xml config file

取消注释hibernate.cfg.xml配置文件中的注释映射代码

<!--  <mapping class="com.lsyh.swati.zk.model.Payment"/> -->

change it to

<mapping class="com.lsyh.swati.zk.model.Payment"/>

for more information refer this link

有关更多信息,请参阅此链接

http://www.javabeat.net/tips/112-configure-mysql-database-with-hibernate-mappi.html

http://www.javabeat.net/tips/112-configure-mysql-database-with-hibernate-mappi.html

#4


1  

Your entity bean is not getting registered i guess. Set proper root package name of your entity beans in packagesToScan property. Also check your @Table(name="name_of_your_table").

我想你的实体bean没有注册。在packagesToScan属性中设置实体bean的正确根包名称。还要检查你的@Table(name =“name_of_your_table”)。

#5


1  

Although accepted answer is correct, would like to add context to the first part of the answer.

虽然接受的答案是正确的,但是想在答案的第一部分添加上下文。

Inside of your config.java (or whatever you have named your application configuration file in packages), ensure you have properly configured your entityScan:

在config.java中(或者您在包中命名应用程序配置文件的任何内容),确保您已正确配置了entityScan:

package com.example.config;

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

@EntityScan("com.example.entities")

However, if you like our team have moved your objects into their own packages, you may want to allow for a scan of all package folders:

但是,如果您希望我们的团队将您的对象移动到他们自己的包中,您可能希望允许扫描所有包文件夹:

@EntityScan("com.example.*")

Now that not all entities are in the entities folder specifically.

现在并非所有实体都在实体文件夹中。

#6


0  

For me, my Class was not listed in my Persistence.xml file in the class section.

对我来说,我的类未列在类部分的Persistence.xml文件中。

Do that to solve the ish. or wherever your classes are listed.

这样做可以解决问题。或列出您的课程的任何地方。

#1


28  

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.

    要么您没有在hibernat.cfg.xml中列出付款,要么在您配置映射类的位置。

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

    另一个原因可能是javax之间的混淆......实体和org.hibernate ....实体。确保使用第一个。

#2


26  

Instead of

代替

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

try this

尝试这个

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

#3


2  

uncomment the commented mapping code in hibernate.cfg.xml config file

取消注释hibernate.cfg.xml配置文件中的注释映射代码

<!--  <mapping class="com.lsyh.swati.zk.model.Payment"/> -->

change it to

<mapping class="com.lsyh.swati.zk.model.Payment"/>

for more information refer this link

有关更多信息,请参阅此链接

http://www.javabeat.net/tips/112-configure-mysql-database-with-hibernate-mappi.html

http://www.javabeat.net/tips/112-configure-mysql-database-with-hibernate-mappi.html

#4


1  

Your entity bean is not getting registered i guess. Set proper root package name of your entity beans in packagesToScan property. Also check your @Table(name="name_of_your_table").

我想你的实体bean没有注册。在packagesToScan属性中设置实体bean的正确根包名称。还要检查你的@Table(name =“name_of_your_table”)。

#5


1  

Although accepted answer is correct, would like to add context to the first part of the answer.

虽然接受的答案是正确的,但是想在答案的第一部分添加上下文。

Inside of your config.java (or whatever you have named your application configuration file in packages), ensure you have properly configured your entityScan:

在config.java中(或者您在包中命名应用程序配置文件的任何内容),确保您已正确配置了entityScan:

package com.example.config;

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

@EntityScan("com.example.entities")

However, if you like our team have moved your objects into their own packages, you may want to allow for a scan of all package folders:

但是,如果您希望我们的团队将您的对象移动到他们自己的包中,您可能希望允许扫描所有包文件夹:

@EntityScan("com.example.*")

Now that not all entities are in the entities folder specifically.

现在并非所有实体都在实体文件夹中。

#6


0  

For me, my Class was not listed in my Persistence.xml file in the class section.

对我来说,我的类未列在类部分的Persistence.xml文件中。

Do that to solve the ish. or wherever your classes are listed.

这样做可以解决问题。或列出您的课程的任何地方。