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

Posted

技术标签:

【中文标题】Hibernate 抛出奇怪的错误:类未映射【英文标题】:Hibernate throws strange error: Class is not mapped 【发布时间】:2012-01-21 10:12:00 【问题描述】:

这是错误

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

这就是我在 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;
    

这是堆栈跟踪

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

【问题讨论】:

你能显示Payment类吗?它是如何注释的? 相关:***.com/questions/14446048/… 【参考方案1】:

我认为原因有两个:

    您的 hibernat.cfg.xml 中或者您配置映射类的任何位置都没有列出 Payment。

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

【讨论】:

好吧,先生,@Entity 注释曾经实际上是 org.hibernate... 我已将其更改为 javax.persistence.Entity。结果列表仍然是空的。它是空的,因为表名(以及列名)没有从 camelCase 转换为 camel_case(下划线与数据库中一样)。如果你能提示我这个......无论如何谢谢 你可以简单地在你的实体类上使用@Table(name="camel_case") 我是否必须在 hibernate.cfg.xml 中列出我的注释模型类,还是只有当您有 xml 映射时才使用此用例?【参考方案2】:

代替

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

试试这个

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

【讨论】:

Tahnks,这消除了错误!虽然返回的列表是空的,并且日志中有一个WARN:2011-12-15 19:39:39,246 [http-8080-2] WARN org.hibernate.hql.QuerySplitter - no persistent classes found for query class: select p from com.lsyh.swati.zk.model.Payment p 签入您的支付类 Entity 应该来自 javax.persistence.Entity,Table 应该来自 javax.persistence.Table。不要使用 hibernate 包中的注解 感谢您的回答,我接受了 Jens 的回答,因为结果相同,但它让我有点清楚问题出在哪里。还是谢谢! 你能给我解释一下为什么会这样吗?我遇到了同样的问题并使用此解决方案让我的代码工作? 任何人都可以解释一下为什么会这样吗?它解决了我在使用 select 语句时的问题,尽管我在 delete 语句中直接使用实体名称工作正常。【参考方案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

【讨论】:

OP 正在使用带注释的类,为什么要从配置文件中取消注释呢? 虽然是带注解的类,但需要像上面说的那样映射到配置文件中。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

package com.example.config;

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

@EntityScan("com.example.entities")

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

@EntityScan("com.example.*")

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

【讨论】:

【参考方案6】:

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

这样做是为了解决这个问题。或列出您的课程的任何位置。

【讨论】:

【参考方案7】:

我有同样的问题,而不是 @Entityt 映射我 我使用以下代码获取记录 私人@Autowired HibernateTemplate eventHibernateTemplate;

    List<Map<String, Object>> list = null;
            list = incidentHibernateTemplate.execute(new HibernateCallback<List<Map<String, Object>>>() 

            @Override
            public List<Map<String, Object>> doInHibernate(Session session) throws HibernateException 
                Query query = session.createSQLQuery("SELECT * from table where appcode = :app");
                    query.setParameter("app", apptype);
                query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
                return query.list();

                
            );

我使用以下代码进行更新

private @Autowired HibernateTemplate incidentHibernateTemplate;
Integer updateCount = 0;

    updateCount = incidentHibernateTemplate.execute((Session session) -> 
        Query<?> query = session
                    .createSQLQuery("UPDATE  tablename SET key = :apiurl, data_mode = :mode WHERE apiname= :api ");
          query.setParameter("apiurl", url);
          query.setParameter("api", api);
          query.setParameter("mode", mode);
            return query.executeUpdate();
        
    );

【讨论】:

以上是关于Hibernate 抛出奇怪的错误:类未映射的主要内容,如果未能解决你的问题,请参考以下文章

php artisan 抛出 FatalErrorException 类未找到

Hibernate初探之单表映射——创建对象-关系映射文件

学习hibernate

Hibernate简单用法解析

序列化 Hibernate 对象时抛出奇怪的 Jackson 异常

Hibernate 基本使用