I'm trying to learn to use Hibernate using MySQL, I've never worked with it before and after a chain of errors I finally get stucked with this:
我正在尝试学习使用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)
I've tried with possible solutions of another questions, but nothing, it doesn't work. This is what I've done so far:
我尝试过另一个问题的可能解决方案,但没有,它不起作用。这是我到目前为止所做的:
hibernate.cfg.xml (Folder src)
hibernate.cfg.xml(Folder 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 (Folder *src\main\resources\org\hibernate\tutorial\hbm*)
country.hbm.xml(Folder * 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 */
}
}
- Edit 20130301
I've altered with yout suggestions several things
我已经改变了你的建议几件事
hibernate.cfg.xml
<!-- Mapping files -->
<mapping resource="org/hibernate/tutorial/hbm/Country.hbm.xml"/>
I renamed and moved the file Country.hbm.xml (It was country.hbm.xml) and changed this
我重命名并移动了文件Country.hbm.xml(它是country.hbm.xml)并更改了它
<class name="Country" table="country">
<!-- <class name="org.hibernate.tutorial.hbm.country" table="country"> -->
The file was moved to src\org\hibernate\tutorial\hbm
该文件已移至src \ org \ hibernate \ tutorial \ hbm
The class country.java was renamed to Country.java
class country.java已重命名为Country.java
And finally this line was modified in the Test.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() );
}
Now I'm getting this as an error
现在我认为这是一个错误
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
I appreciate your help. Thank you.
我感谢您的帮助。谢谢。
2 个解决方案
#1
25
Your country.hbm.xml
is malformed:
您的country.hbm.xml格式不正确:
<id name="id_country">
is an open tag, which never closes. I suspect you meant:
是一个开放的标签,永远不会关闭。我怀疑你的意思是:
<id name="id_country"/>
(notice the closing slash).
(注意结束斜线)。
Then (as @RameshK pointed out), you'd have to add
然后(正如@RameshK指出的那样),你必须添加
<mapping resource="org/hibernate/tutorial/hbm/country.hbm.xml"/>
to your hibernate.cfg.xml
file.
到您的hibernate.cfg.xml文件。
One minor niggle: As per normal coding convention, classes in Java are Capitalised, so I would change country
to Country
.
一个小问题:根据正常的编码约定,Java中的类是大写的,所以我将国家改为Country。
#2
3
I finally solve the problem, after editing all of the things in the answer as I show there, I modified the Country.hbm.xml file to this: (Notice the commented line)
我终于解决了这个问题,在编辑了答案中的所有内容之后,我将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>
It has to be org.hibernate.tutorial.hbm.Country
and not org.hibernate.tutorial.hbm.country
它必须是org.hibernate.tutorial.hbm.Country而不是org.hibernate.tutorial.hbm.country
#1
25
Your country.hbm.xml
is malformed:
您的country.hbm.xml格式不正确:
<id name="id_country">
is an open tag, which never closes. I suspect you meant:
是一个开放的标签,永远不会关闭。我怀疑你的意思是:
<id name="id_country"/>
(notice the closing slash).
(注意结束斜线)。
Then (as @RameshK pointed out), you'd have to add
然后(正如@RameshK指出的那样),你必须添加
<mapping resource="org/hibernate/tutorial/hbm/country.hbm.xml"/>
to your hibernate.cfg.xml
file.
到您的hibernate.cfg.xml文件。
One minor niggle: As per normal coding convention, classes in Java are Capitalised, so I would change country
to Country
.
一个小问题:根据正常的编码约定,Java中的类是大写的,所以我将国家改为Country。
#2
3
I finally solve the problem, after editing all of the things in the answer as I show there, I modified the Country.hbm.xml file to this: (Notice the commented line)
我终于解决了这个问题,在编辑了答案中的所有内容之后,我将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>
It has to be org.hibernate.tutorial.hbm.Country
and not org.hibernate.tutorial.hbm.country
它必须是org.hibernate.tutorial.hbm.Country而不是org.hibernate.tutorial.hbm.country