当前位置:编程学习 > JAVA >>

大神求解,hibernate4.2.1的一个HelloWorld例子配置搞了两天

要毕业了,什么也不懂,最近想学三大框架,刚学完STUTRS2,昨天开始学hibernate,教程第一讲就弄了两天还停留在下面这个问题,急死人 了。教程上说的是hibernate3.2,但是我现在到官网下了个4.2的版本,实在是整天两天没成功运行 ,后面的教程就一直挡着了,这个是照着教程上看的写的实体类Student,
package com.luhy.hibernate.model;

public class Student {
private int id;
private String name;
private int age;


public Student(){

}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}


}


测试类:
package com.luhy.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

import com.luhy.hibernate.model.Student;

public class Test {
public static void main(String[] args) {
 Student st = new Student();
        st.setId(2);
        st.setName("学生");
        st.setAge(20);
        
        Configuration cfg = new Configuration();

        cfg.configure();
        ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
        SessionFactory sf = cfg.configure().buildSessionFactory(serviceRegistry);
        Session session = sf.openSession();
        session.beginTransaction();                    //事务开启
        session.save(st);                            //保存对象
        session.getTransaction().commit();
        session.close();    
        sf.close();
}
}


Student.hbm.xml配置:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="org.hibernate.tutorial.domain">
<class name="Student" table="student">
<id name="id" column="id"/>
<property name="name" column="name"/>
<property name="age" column="age"/>
</class>
</hibernate-mapping>


hibernate.cfg.xml配置:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/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/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">lu5896848</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>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>-->

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>-->

        <mapping resource="com/luhy/hibernate/model/Student.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

工程目录,帮看下对应的JAR包是否齐全?



结果是,运行后出错,早上搞到晚上睡觉也弄不好,网上百度谷歌也找不出问题,网上对应的和我这版本的问题资料太少,错误代码如下:
2013-5-12 17:02:51 org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
2013-5-12 17:02:51 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.2.1.Final}
2013-5-12 17:02:51 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
2013-5-12 17:02:51 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
2013-5-12 17:02:51 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
2013-5-12 17:02:51 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
Exception in thread "main" org.hibernate.MappingException: invalid configuration
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2028)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1945)
at org.hibernate.cfg.Configuration.configure(Configuration.java:1924)
at com.luhy.hibernate.test.Test.main(Test.java:20)
Caused by: org.xml.sax.SAXParseException: The content of element type "session-factory" must match "(property*,mapping*,(class-cache|collection-cache)*,event*,listener*)".
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleEndElement(XMLDTDValidator.java:2017)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endElement(XMLDTDValidator.java:901)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2938)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:465)
at org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2025)
... 3 more


Hibernate helloworld Java 类 SQL --------------------编程问答-------------------- Caused by: org.xml.sax.SAXParseException
报这个错误表示xml文件解析错误,我看了一下,发现你的hibernate.hbm.xml文件有没删掉的注释符合哦,
23行和32行的结尾有“-->”,是不是删漏了?
去掉后,你再试试 --------------------编程问答--------------------
引用 1 楼 xxhhbb1538 的回复:
Caused by: org.xml.sax.SAXParseException
报这个错误表示xml文件解析错误,我看了一下,发现你的hibernate.hbm.xml文件有没删掉的注释符合哦,
23行和32行的结尾有“-->”,是不是删漏了?
去掉后,你再试试

不好意思,写错了,是hibernate.cfg.xml文件 --------------------编程问答--------------------
引用 1 楼 xxhhbb1538 的回复:
Caused by: org.xml.sax.SAXParseException
报这个错误表示xml文件解析错误,我看了一下,发现你的hibernate.hbm.xml文件有没删掉的注释符合哦,
23行和32行的结尾有“-->”,是不是删漏了?
去掉后,你再试试
多谢,我是多官方文档复制配置文件下来修改的,两天都没发现原来这个地方自己不小心弄错了,修改后,也出现了新的错误,说我的映射文件不能解析,不知是什么问题

2013-5-12 17:45:45 org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
2013-5-12 17:45:45 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.2.1.Final}
2013-5-12 17:45:45 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
2013-5-12 17:45:45 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
2013-5-12 17:45:45 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
2013-5-12 17:45:45 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
2013-5-12 17:45:45 org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: com/luhy/hibernate/model/Student.hbm.xml
2013-5-12 17:45:45 org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
2013-5-12 17:45:45 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
2013-5-12 17:45:45 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
2013-5-12 17:45:45 org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: com/luhy/hibernate/model/Student.hbm.xml
2013-5-12 17:45:45 org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
Exception in thread "main" org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/luhy/hibernate/model/Student.hbm.xml
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3440)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3429)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3417)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1348)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1747)
at com.luhy.hibernate.test.Test.main(Test.java:22)
Caused by: org.hibernate.MappingException: class org.hibernate.tutorial.domain.Student not found while looking for property: id
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:3437)
... 5 more
Caused by: java.lang.ClassNotFoundException: org.hibernate.tutorial.domain.Student
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:192)
at org.hibernate.internal.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:228)
... 11 more
--------------------编程问答-------------------- <hibernate-mapping package="org.hibernate.tutorial.domain">这里package写错了 --------------------编程问答--------------------
引用 4 楼 xizhou704 的回复:
<hibernate-mapping package="org.hibernate.tutorial.domain">这里package写错了


+++
确实是报名写错了,应该使用所配置的类的包名com.luhy.hibernate.model --------------------编程问答--------------------
引用 4 楼 xizhou704 的回复:
<hibernate-mapping package="org.hibernate.tutorial.domain">这里package写错了
唉,这两天前前后后我重新建立了这些配置文件,这里出错了都没发现,刚修改了过来了,修改为Student类所在的包全包了,但还继续出错,大神,你要帮帮下我,这两天弄得我有点想放弃了

2013-5-12 17:55:33 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
2013-5-12 17:55:33 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
2013-5-12 17:55:33 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
2013-5-12 17:55:33 org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: com/luhy/hibernate/model/Student.hbm.xml
2013-5-12 17:55:33 org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
2013-5-12 17:55:33 org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
2013-5-12 17:55:33 org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
2013-5-12 17:55:33 org.hibernate.cfg.Configuration addResource
INFO: HHH000221: Reading mappings from resource: com/luhy/hibernate/model/Student.hbm.xml
2013-5-12 17:55:33 org.hibernate.cfg.Configuration doConfigure
INFO: HHH000041: Configured SessionFactory: null
2013-5-12 17:55:33 org.hibernate.cfg.Configuration$MappingsImpl addImport
INFO: HHH000071: Duplicate import: com.luhy.hibernate.model.Student -> com.luhy.hibernate.model.Student
2013-5-12 17:55:33 org.hibernate.cfg.Configuration$MappingsImpl addImport
INFO: HHH000071: Duplicate import: com.luhy.hibernate.model.Student -> Student
Exception in thread "main" org.hibernate.InvalidMappingException: Could not parse mapping document from resource com/luhy/hibernate/model/Student.hbm.xml
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3440)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3429)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3417)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1348)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1747)
at com.luhy.hibernate.test.Test.main(Test.java:22)
Caused by: org.hibernate.DuplicateMappingException: Duplicate class/entity mapping com.luhy.hibernate.model.Student
at org.hibernate.cfg.Configuration$MappingsImpl.addClass(Configuration.java:2592)
at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:174)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3437)
... 5 more
--------------------编程问答--------------------
引用 5 楼 xxhhbb1538 的回复:
Quote: 引用 4 楼 xizhou704 的回复:

<hibernate-mapping package="org.hibernate.tutorial.domain">这里package写错了


+++
确实是报名写错了,应该使用所配置的类的包名com.luhy.hibernate.model
嗯,刚刚修改了,但还出错,错误代码在6楼,你可以再帮我看一下么 --------------------编程问答-------------------- mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

这是我建立的表,表是没有问题的,可是上面的问题,,, --------------------编程问答-------------------- Duplicate import,配置重复导入的问题。
cfg.configure();执行一次就可以了,你的这句代码执行了两次,就出现这个问题了 --------------------编程问答--------------------
引用 9 楼 xizhou704 的回复:
Duplicate import,配置重复导入的问题。
cfg.configure();执行一次就可以了,你的这句代码执行了两次,就出现这个问题了
唉,去掉重复的这个了,可以往表里插入条数据了,有点欣慰了。刚开始是照着教程上写的测试类,但教程上的一个方法在新版本里给废弃了,然后到网上找了解决办法,就把人家写的拿下来了,我刚刚测试了几次,是可以正常运行了,太感谢你了。但发现个小问题,应该是编码的问题,st.setName("aa");插入字母的时候这个字段是正常的,但插入的是中文时,表里这个字段值就是为空的了,请问下这种情况有什么简单的方便解决吗 --------------------编程问答-------------------- 你是在数据库中查看数据的,还是在程序中使用查询语句的 --------------------编程问答--------------------
引用 11 楼 xizhou704 的回复:
你是在数据库中查看数据的,还是在程序中使用查询语句的
用命令查看的,应该是前者。
mysql> select * from student;
+----+------+------+
| id | name | age  |
+----+------+------+
|  2 | ??   |   20 |
|  3 | aa   |   20 |
|  4 | aa   |   20 |
+----+------+------+
3 rows in set (0.00 sec)

mysql>
打问号的就是我想插入中文字符串时的结果,还有,刚你提到了是不是用程序查看,也想了解下用程序查看,也得设置正确编码才能正常查看的吗,不可以直接访问查看? --------------------编程问答-------------------- 数据库中输入命令:set names GBK
然后再查询就可以了
程序中可能要加上useUnicode=true&characterEncoding=UTF-8
--------------------编程问答--------------------
引用 13 楼 xizhou704 的回复:
数据库中输入命令:set names GBK
然后再查询就可以了
程序中可能要加上useUnicode=true&characterEncoding=UTF-8
我把表修改为GBK了,也把数据库my.ini里的默认字符修改为GBK了,但我的myeclipse工程默认的也是用GKB,一插入中文就变成问号了 --------------------编程问答-------------------- 统一用UTF-8比较好,修改workspace的字符集

window -> Preferences -> General -> Workspace -> Text file encoding 选择字符集,如果没有可以直接输入。 --------------------编程问答--------------------
引用 15 楼 peng_hao1988 的回复:
统一用UTF-8比较好,修改workspace的字符集

window -> Preferences -> General -> Workspace -> Text file encoding 选择字符集,如果没有可以直接输入。
也试过了,表和IDE都修改UTF8了也是哪样问题 --------------------编程问答-------------------- 修改完成后重启一下mysql试试。 --------------------编程问答-------------------- cfg.configure();
SessionFactory sf = cfg.configure().buildSessionFactory(serviceRegistry); 
两个cfg.configure()重复了 --------------------编程问答-------------------- 学hibernate,就是学它的配置 --------------------编程问答--------------------
引用 17 楼 peng_hao1988 的回复:
修改完成后重启一下mysql试试。
你好,能不能帮我解释一下MYSQL的字符集,之前我把my.ini文件里的两个文件都修改为default-character-set=utf8,character-set-server=utf8,然后重新建了个表,结果发现表的字符还是latin1,我不是修改了默认字符编码了吗,为什么修改重启后也没有效果,然后我百度了下,发现挺复杂的,还有什么“MySQL的字符集问题主要是两个概念,一个是Character Sets,一个是Collations,前者是字符内容及编码,后者是对前者进行比较操作的一些规则。”的说法,我读了两次还是不能理解他们的区别,
 show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | utf8_general_ci   |
| collation_server     | utf8_general_ci   |
+----------------------+-------------------+
3 rows in set (0.00 sec)
mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
这两个又是指哪,怎么这么多需要设置编码? --------------------编程问答-------------------- 除 --------------------编程问答-------------------- lz,为什么我和你一样看着3.2的视频,用着4.2的包不会有问题,因为,看的不是照抄,而是要学方法,配置文件就去包里找,大体一样,mysqL的问题,直接下载一个客户端看得了,我之前也被搞死,客户端显示的编码又是一个问题。
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,