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 类未找到