【问题标题】:org.hibernate.hql.internal.ast.QuerySyntaxException: table is not mapped [from table]org.hibernate.hql.internal.ast.QuerySyntaxException:表未映射[来自表]
【发布时间】:2013-02-28 19:46:53
【问题描述】:

我正在尝试通过 MySQL 学习使用 Hibernate,但在一系列错误之前和之后我从未使用过它,我终于被这个问题困住了:

Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: country is not mapped [from country]
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
    at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:324)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3291)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3180)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1735)
    at org.hibernate.tutorial.hbm.Test.main(Test.java:37)

我已经尝试了其他问题的可能解决方案,但没有,它不起作用。这是我到目前为止所做的:

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> 
        <!-- Database connection settings --> 
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
        <property name="connection.url">jdbc:mysql://localhost:3306/stock</property> 
        <property name="connection.username">root</property> 
        <property name="connection.password">root</property>   

        <!-- JDBC connection pool (use the built-in) --> 
        <property name="connection.pool_size">1</property>   

        <!-- SQL dialect --> 
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>   

        <!-- Echo all executed SQL to stdout --> 
        <property name="show_sql">true</property>   
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">create</property>

        <!-- configuration pool via c3p0-->
        <property name="c3p0.acquire_increment">1</property>
        <property name="c3p0.idle_test_period">3600</property> <!-- seconds -->
        <property name="c3p0.min_size">3</property>
        <property name="c3p0.max_size">5</property>
        <property name="c3p0.max_statements">0</property>
        <property name="c3p0.timeout">3605</property> <!-- seconds -->
        <property name="hibernate.c3p0.preferredTestQuery">select 1;</property>

        <!-- Mapping files --> 
        <!--<mapping resource="country.hbm.xml"/> -->
    </session-factory> 
</hibernate-configuration>

country.hbm.xml(文件夹 *src\main\resources\org\hibernate\tutorial\hbm*

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
    <class name="org.hibernate.tutorial.hbm.country" table="country">
        <id name="id_country">
        <property name="country"/>
    </class>
</hibernate-mapping>

country.java

package org.hibernate.tutorial.hbm;

public class country {
    private int id_country;
    private String country;

    public int getId_country() {
        return id_country;
    }
    public void setId_country(int id_country) {
        this.id_country = id_country;
    }
    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }

}

Test.java

package org.hibernate.tutorial.hbm;

import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.Session;
//import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tutorial.hbm.country; /* required for test function only */

public class Test {

    private static final SessionFactory sessionFactory;

        static {
            try {
                // Initialize factory using contents of hibernate.cfg.xml
                sessionFactory = new Configuration().configure().buildSessionFactory();
            } catch (Throwable ex) {
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }

        }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void main (String[] args) {

        country mycls = new country();
        /* the id field will auto-increment to a unique value which will distinguish records */
        //mycls.setCountry("My Property");
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        List result = session.createQuery( "from country" ).list();
        for ( country ctry : (List<country>) result ) {
            System.out.println( "Country (" + ctry.getId_country() + ") : " + ctry.getCountry() );
        }
        session.getTransaction().commit();
        session.close(); /* if this test succeeds, you'll find a new record in your MySQL database */

    }

}

- 编辑 20130301

我根据你的建议修改了几件事

hibernate.cfg.xml

<!-- Mapping files --> 
<mapping resource="org/hibernate/tutorial/hbm/Country.hbm.xml"/>

我重命名并移动了 Country.hbm.xml 文件(原为 country.hbm.xml)并更改了此文件

<class name="Country" table="country">
<!-- <class name="org.hibernate.tutorial.hbm.country" table="country"> -->

文件已移至 src\org\hibernate\tutorial\hbm

country.java 类重命名为 Country.java

最后在Test.java中修改了这一行

List result = session.createQuery( "from Country" ).list();
        for ( Country ctry : (List<Country>) result ) {
            System.out.println( "Country (" + ctry.getId_country() + ") : " + ctry.getCountry() );
        }

现在我发现这是一个错误

Initial SessionFactory creation failed.org.hibernate.InvalidMappingException: Could not parse mapping document from resource org/hibernate/tutorial/hbm/Country.hbm.xml
Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.hibernate.tutorial.hbm.Test.<clinit>(Test.java:21)
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from resource org/hibernate/tutorial/hbm/Country.hbm.xml
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3423)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3412)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3400)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1330)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1730)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1781)
    at org.hibernate.tutorial.hbm.Test.<clinit>(Test.java:18)
Caused by: org.hibernate.MappingException: class Country not found while looking for property: id_country
    at org.hibernate.internal.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:232)
    at org.hibernate.mapping.SimpleValue.setTypeUsingReflection(SimpleValue.java:324)
    at org.hibernate.cfg.HbmBinder.bindSimpleId(HbmBinder.java:449)
    at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:382)
    at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:322)
    at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:173)
    at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3420)
    ... 6 more
Caused by: java.lang.ClassNotFoundException: Country
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:192)
    at org.hibernate.internal.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:228)
    ... 12 more

感谢您的帮助。谢谢。

【问题讨论】:

  • 尝试将此行添加到您的 hibernate.cfg.xml 文件中
  • 不,我尝试使用 "org/hibernate/tutorial/hbm/country.hbm.xml" "org\hibernate\tutorial\hbm\country.hbm.xml" "main\resources\org\ hibernate\tutorial\hbm\country.hbm.xml" "main/resources/org/hibernate/tutorial/hbm/country.hbm.xml" 并显示 Initial SessionFactory creation failed.org.hibernate.InvalidMappingException: Unable to read XML

标签: java mysql hibernate


【解决方案1】:

您的country.hbm.xml 格式错误:

<id name="id_country">

是一个打开的标签,它永远不会关闭。我怀疑你的意思是:

<id name="id_country"/>

(注意结束斜线)。

然后(正如@RameshK 指出的那样),您必须添加

<mapping resource="org/hibernate/tutorial/hbm/country.hbm.xml"/>

到您的hibernate.cfg.xml 文件。

一个小问题:按照正常的编码约定,Java 中的类都是大写的,所以我会将country 更改为Country

【讨论】:

  • 我更正了你所说的,但仍然显示相同的错误,我关闭并重新打开项目以刷新但什么也没有。
  • 好的,关于 cfg.xml,我尝试使用 @RameshK 说的资源来执行此操作,但随后显示无法访问 XML 我尝试了四种不同的组合,文件的当前文件夹是src\main\resources\org\hibernate\tutorial\hbm),是它工作的唯一地方。
  • 您是否将&lt;mapping&gt; 添加回hibernate.cfg.xmlsrc/main/resources 也在你的类路径中吗?
  • 更改hibernate.cfg.xml并尝试。
  • 您是否将country.java 重命名为Country.java
【解决方案2】:

我终于解决了这个问题,在编辑了我在那里显示的答案中的所有内容后,我将 Country.hbm.xml 文件修改为:(注意注释行)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
    <!-- <class name="Country" table="country"> -->
    <class name="org.hibernate.tutorial.hbm.Country" table="country">
        <id name="id_country"/>
        <property name="country"/>
    </class>
</hibernate-mapping>

必须是org.hibernate.tutorial.hbm.Country 而不是org.hibernate.tutorial.hbm.country

【讨论】:

  • 我会说 beny23 为您提供了解决方案,恕我直言,您应该接受他的回答。
  • 对于这种情况,存在标志。如果每个投票赞成 Shlomi 评论的人都标记了答案,那么它可能不会再出现在这里了。
猜你喜欢
  • 2013-07-03
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 2016-03-23
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多