我试图学习通过MySQL使用Hibernate,但在出现一系列错误之前和之后,我从未使用过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 (文件夹src)
<?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 */ } }
我已根据您的建议更改了几件事
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
我感谢您的帮助。谢谢。
我终于解决了这个问题,在编辑了答案中显示的所有内容之后,我将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
org.hibernate.tutorial.hbm.Country
org.hibernate.tutorial.hbm.country