Eclipse不像是MyEclipse,它的Hibernate的使用需要进行从头配置。配置的基本方法就是把相应的jar包复制到WEB-INF/lib目录下。这些jar包,我是从
这个地址下载的。
在“hibernate-distribution-3.6.10.Final\lib\required”这个目录下找到
antlr-2.7.6.jar、
commons-collections-3.1.jar、
dom4j-1.6.1.jar、
javassist-3.12.0.GA.jar、
jta-1.1.jar、
slf4j-api-1.6.1.jar
这六个jar包,再加上第一层目录下的hibernate3.jar这个jar包,还有,我连接的数据库是MySQL,还需要一个JDBC的驱动包我就加了mysql-connector-java-5.1.31-bin.jar这个包,这样这八个包就基本满足了书本上的要求了。于是,就开始试运行,结果很自然的就出现了报错,
(--------Hibernate第一个异常----缺少javax.persistence.jar------)
错误如下:
我们先不看上面的“slf4j...failed......”先看下面的关键异常:就是说:javax.persistence.EntityListeners这个类找不到。于是把这个错误放在网上搜索,结果网上说这个包在Java_ee_sdk这个库中。于是就到:
“http://www.oracle.com/technetwork/java/javaee/downloads/index.html”
这个页面上下载了java_ee_sdk-7u1.zip这个文件,解压后搜索persistence.jar,果然找到了javax.persistence.jar。然后复制到lib,运行...... 这时出现了另外一个异常:
(--------Hibernate第二个异常----<hibernate-mapping>标签中,忘记配置包名属性------)
出现了这个异常时,首先我注意的是它的类型:“ org.hibernate.InvalidMappingException”,乍一看去,感觉陌生,似又熟悉。在网上一查,果不其然,是映射文件的配置问题。 再看下面的原因提示:说的是Customer这个类没有找到。我首先想的是,是不是我的Customer类的名字的问题。检查之后,命名没有一点问题。然后我就仔细的在我配置的映射文件中去找错误,还是找不到引起这个错误的原因。这时我就仔细的回想,我看书所学到的关于Hibernate的一切,觉得基本的元素都已经具备。
于是再去从<hibernate-mapping>这个标签开始看起,猛然发现这里面还需要“包”的配置。于是立刻在这个标签里面添加了属性:package="pojos" 。立刻,上面的这个错误就改变了,出现了下面的异常...
(--------Hibernate第三个异常----实体类中getter或者setter方法的命名出错------)
这应当算是一个经典的异常了:Exception in thread "main" org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]。其中“instantiate”,这个单词的意思是“v.实例化”。意思是,不能实例化默认Tuplizer。TupliZer这个词网上也找不到翻译。不过没关系,继续往下看,找到了这句话:Could not find a getter for password in class pojos.Customer。于是想,问题大概是出在password这个属性上了。于是再去看映射文件,结果怎么也找不到错误。于是就只好去看实体类了。最后问题出在了我的password的getter和setter方法上了。是把password写成了paassword了,多写了一个a。至于为什么是这样,这里就不讨论了。发现了错误,就去改正,改正了后,就出现了以下的另外一个异常...
(--------Hibernate第四个异常----数据库没有设置主键的自动增长------)
这里这个异常是:could not insert。就是无法执行插入操作。继续往下看,看导致这个异常的原因...
这里说的原因是:Caused by: java.sql.SQLException: Field ‘ID‘ doesn‘t have a default value。
分析异常的字面意思:ID字段没有默认值。经过网上的资料查找发现,问题出在了主键上。
有这样一个标签:
<id name="id" column="ID">
<generator class="native"/>
</id>
其中<generator>设置了一个值为native的class属性。意思是:智能根据所连接数据库设置的增长模式,选择一种增长方式来进行插入操作。 于是,就去把主键的自动增长选项勾上。再运行,终于顺利的插入了,我所要插入的数据!
(-------------MySQL数据库显示乱码,是因为Hibernate.cfg.xml中还有一个属性没有配置-----------------------)
这时,我又看到了一个问题,就是我插入到数据库中的汉字全都被“?”代替了。就是出现了乱码现象。
这个问题的解决,这里先给出一个治标不治本的办法。就是在<hibernate.cfg.xml>中添加:
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
现在我们该回过头来看看:异常显示的头三句:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
(--------Hibernate第五个异常----slf4j-simple-1.7.12.jar没有添加------)
slf4j是负责日志的,我们在最开始也已经加入了slf4j-api-1.6.1.jar,但是还缺少一个包,还需要到网上去下载:
“http://www.slf4j.org/dist/slf4j-1.7.12.zip”
解压后搜索"simple",就会找到slf4j-simple-1.7.12.jar,把它复制到lib目录下。这样问题就得到了解决。
(--------Hibernate第六个异常-----getcurrentsession的异常-----)
这个异常,在前几步进行中也会出现,只要你没有作相应的配置。这个配置是这样的:在<hibernate.cfg.xml>中添加:<property name="current_session_context_class">thread</property>
这样就会解决。
昨天调试了一个晚上的Hibernate,今天用了一下午的时间把这些成果给写出来。为了以后有的查。