在Eclipse中使用Hibernate

本文档详细介绍了如何在Eclipse环境中集成和使用Hibernate框架。首先讲述了Hibernate产生的背景和现状,指出其作为轻量级数据库持久化技术的优越性。接着,通过一个实例展示了从下载、安装Hibernate到配置XML映射文件、创建Session管理类的过程。此外,还提供了创建测试类的方法,并讲解了如何由XML映射文件生成数据库表以及通过实体类生成XML映射文件的工具使用。最后,讨论了解决Tomcat中文问题的策略。整个教程旨在帮助开发者快速掌握在Eclipse中使用Hibernate进行数据库操作的方法和技巧。
摘要由CSDN通过智能技术生成
1 概述
26.1.1 持久化框架产生
的背景和现状
在Java数据库项目中,由于数据库是关系型而非面向对象的.很多时候,用面向对象方
法完成了前期的设计和分析,到了数据库层编程的时候就会变得很别扭难受,其中最痛苦的
就是写面向过程的SQL语句.
J2EE开发主要由JSP,Servlet,JavaBean,EJB四部份组成.其中EJB是J2EE中一个比较
重要的部份,它提供了企业级开发的所需要的分布式支持.但现实中的大部份项目都是单服
务器的轻量级项目,一般都不会涉及到分布式的开发环境,这时候用EJB就象大炮打蚊子,
蚊子没打到,房子却被打破个洞.EJB的笨重,复杂是出了名的,这一直让开发者很不满,
其中EJB中Entity Bean受到的批评最多,现实项目中鲜有使用Entity Bean的成功范例.
开发者急切的需要一种符合Java编程习惯的,适合轻量级开发的,易于使用的数据库持
久化解决方案.在这个背景下就产生了轻量级的数据库持久化技术,其中最主要的就是
Hibernate,JDO.
Hibernate是一个没有什么名分的民间开源项目,有点象一个草莽英雄,但Hibernate从实
用出发的设计思路,使得它脱颖而出成为最流行的持久化技术.Hibernate的作者Gavin King
也一举成名,现已成为EJB3.0专家组的成员,并且在EJB 3.0的Entity Bean部份,将采用和
Hibernate类似的设计方案.因此,Hibernate是开发者学习和使用持久化技术的一个比较好的
选择,即使以后EJB3.0一统天下,所学的Hibernate知识也不会浪费.
JDO1.1是已被JCP(Java规范管理委员会,由SUN,IBM,Oracle等共同参与)通过的一
个规范,由于它是正式的规范,所以也受到了开发者很大的期望.然而,2005年1月19日在
JDO2.0规范的投票中,它被IBM,Oracle,BEA等几家厂商投了反对票,由于得票数不够,
它未能获得通过而成为正式规范.这使得JDO的前景堪忧.
26.1.2 Hibernate简介
Hibernate把开发者从数据库编程中隔离开来,它在数据库外裹了一层面向对象的外衣,
Java程序中所有进出数据库的操作都交给Hibernate来处理,它会为我们自动生成SQL语句操
作数据库.
有了Hibernate后,程序员不再要写繁琐的SQL语句,也不再要把实体对象一个个字段拆
开又组装.说通俗一点,Hibernate就象一位卖苦力的民工,脏活累活它全包了.
下图26.1是Hibernate的示意方式.Hibernate提供了一个和SQL类似的HQL语句,但结合
Hibernate后功能更强大,而且Hibernate能够根据实体对象的状态来自动对数据库进行更新和
插入,很智能化.
HQL语句操作数据库其实也是要转化成标准的SQL语句的,Hibernate根据用户所编写的
XML映射文件来实现HQL到SQL的自动转化.XML映射文件是Hibernate中最关键的配置文
件,它定义了实体类和数据表之间的关系,架起了两者间的桥梁,掌握XML映射文件的编
写是掌握Hibernate的关键.
412
图26.1 Hibernate的示意
Struts提供视图和控制层的支持,Hibernate提供数据层的支持,两者是一个很不错的开
发组合.Struts还只能用于WEB开发,而Hibernate还可以用于Application(包括Eclipse插件)
的开发.
26.1.3 本章说明
Hibernate自带有中文文档,内容权威而全面,翻译得也还不错,是学习Hibernate的必看
文档.不足的地方是,由于内容较多,主线不够突出,而且缺乏一个较为系统的实例.
Hibernate的使用很灵活,但有一些用法是常用的,主要的,有一些则是生僻的,很少用
的.Hibernate中,应该掌握的重点内容是:Session概念,XML映射文件的配置,HQL的语
法.本章用一个实例做主线来贯穿这些Hibernate的核心知识,读者可以顺着这条主线并结合
Hibernate自带文档来学习.
本章的数据库表和数据模型借用了第22章的例子,具体请参阅"22.2.2节 面向对象的
分析与设计",和"22.2.3节 创建数据表".
26.2 Hibernate的下载和安装(V0050)
26.2.1 下载
(1)访问Hibernate的官方网址http://www.hibernate.org ,选择"Download"链接,如
下图26.2所示:
(2)在下图26.3的新页面中,选择正式发布的Hibernate2.1.7c版.另外顺便把Hibernate
Extensions2.1.3也下载了,此软件包里有一些Hibernate的辅助工具,在26.7节会用到.当然,
Hibernate Extensions软件包并不是使用Hibernate开发所必须的.
413
图26.2 hibernate主页 图26.3 下载版本选择
(3)在下图26.4的新页面中,选择下载文件"Hibernate-2.7.1c.zip"
(4)然后在列出的镜像中选择一个来下载.最后下载得到一个名hibernate-2.1.7c.zip的
压缩包.解压后的目标结构如下图26.5所示:
图26.4 下载文件选择 图26.5 hibernate解压后的目标结构
主要目录及文件解释:
hibernate2.jar文件是Hibernate的核心包.
lib目录里有一些第三方支持包,安装时也要用到.
src目录里是Hibernate(hibernate2.jar)的源文件.
etc目录有一些可以参考的例子文件.
doc目录包含Hibernate文档,在doc/reference/zh-cn目录下有其中文文档,分为pdf,
多页面,单页面三种形式存放.
26.2.2 安装
(1)将解压目录中的hibernate2.jar和lib目录下的所有*.jar文件,复制到myweb项目的
hello/WEB-INF/lib目录中.
其他说明:
其实并不需要复制lib目录下的所有*.jar文件,本文只是为了安装上的方便.如果在
414
正式发布程序时,希望只包括真正用到包,可以参考解压目录lib中的README.TXT
文件,里面有详细描述.或者参考Hibernate文档,里面也有部份描述.
注意不要将这些jar文件复制到TOMCAT/common/lib目录下,那是Tomcat全局库所
在目录,有可能引起包冲突.
Hibernate有一个包叫commons-logging-1.0.4.jar,以前安装struts时也复制了一个叫
commons-logging.jar,两个包只保留一个即可,否则可能会引起包冲突.
(2)打开myweb的项目属性窗口,将新复制的hibernate2.jar包加入到项目引用"库"中,
如下图26.6所示.
图26.6 项目引用"库"
其他说明:
库引用只是为了让得包中的类能在编程中被使用.虽然复制了很多第三方包,但在
写代码的时候一般只用到hibernate2.jar包中的类.当然,将所有第三方包加入库引
用,也不会出错.
如果你觉得"包资源管理器"视图显示的包太多,影响操作,可以用"过滤器"过
滤掉一些,如下图26.7操作. 图26.7 过滤掉*.jar的显示
(3)将Hibernate解压目录etc下的
log4j.properties,复制到myweb项目的j2src目录下.
其他说明:
log4j是一个
日志输出软件包,前两步已经将它的包复制到项目lib目录中了.如果没
有log4j.properties,控制台会出两条警告信息(下图26.8),log4j无法起作用.不过,
这并不会和使开发无法前进,只是没有了一些输出信息.
415
图26.8 没有log4j.properties
Hibernate文档和某些文章都是说将log4j.properties复制到hello/WEB-INF/classes目录
下.其实,本文复制到myweb/j2src目录,Eclipse也会自动将log4j.properties复制一
份到hello/WEB-INF/classes,并且会保持两文件内容的同步.
(4)在myweb/j2src目录创建一个hibernate.cfg.xml文件,这个文件是Hibernate的主配置
文件.它分两大块,第一块是定义使用的数据库连接池,第二块是注册XML映射文件,具
体内容如下:





java:comp/env/jdbc/mysql
true
net.sf.hibernate.dialect.MySQLDialect




代码说明:
connection.datasource设定所用的连接池.
show_sql设定在控制台是否显示Hibernate生成的SQL语句,开发期间用true,便于调
试.
dialect告诉Hibernate使用哪种SQL数据库方言(dialet) .不同的数据库都和SQL "标
准"有一些出入,Hibernate会根据设置的方言来适应这些差异.要知道其他数据的
方言名称,可以利用Eclipse的代码提示功能,在Java程序中键入
"net.sf.hibernate.dialect."然后按钮"Alt+/"键.
model.hbm.xml是一个XML映射文件,这个文件创建在model目录下(内容以后将给
出).注意:这里用的是
相对路径,cn字串前面是没有"/"的.
hibernate.cfg.xml还有一种hibernate.properties的写法,在Hibernate的解压目录etc可找
到它的例子.两种写法选一种即可,本文选前一种.
某些属性对Hibernate的性能影响很大,比如batch_size项设置成0和30,性能相差会
有4倍以上.属性会有一个默认值,但如果所开发的项目需要优调性能,则可根据
实际情况来重新设置.如果想了解hibernate.cfg.xml中更多的属性设置,可以查看
Hibernate文档的"表 3.3. Hibernate配置属性",那儿有属性的说明和建议值,本文
不再复述.
416
26.3 一个简单的Hibernate实例
26.3.1 创建XML映射文件:model.hbm.xml
Hibernate之所以能够智能的判断实体类和数据表之间的对应关系,就是因为有XML映
射文件.本步先在model目录下创建一个命为model.hbm.xml的XML映射文件,其内容如下:










代码说明:
model.hbm.xml可以任意命名或放置于其他目录下,当然在hibernate.cfg.xml文件也
要做相应的修改.笔者建议将它和它所对应的实体类放在一个包下,并用包名做文
件名.
项定义了实体类和数据表之间的关系:name是实体类(用类全名),table
是对应的数据表(表名不分大小写).可以省略掉table属性,这时默认表名和实体
类同名.在model.hbm.xml文件中可以设置多个项,笔者建议将一个包中的
所有实体类都集中在一个*.hbm.xml文件中.
项定义了主键id字段所用的键值生成方法,identity是一种MSSQL,DB2,MySQL
通用的主键值生成方法(Oracle不能用identity,可换成sequence).要了解更多,
可以查阅Hibernate文档的"5.1.4. id".
子项定义了实体类和表字段的关联.本例只设置了定义类字段的name属
性,还有一个column属性是定义数据库表字段名的,本例没有设置.Hibernate正是
通过这里的设置建立起实体类和数据库表之间的字段对应关系.本例没有设置
column,则Hibernate会默认它和name属性同名.
假如,想将Grade实体类的name字段对应于数据库表的grade_name字段,并将表字
段的长度定义成16,不充许空值,则可以照如下设置:



体现Hibernate的友好性:它可以设置得很详细,也可以很简洁,当设置
简洁时,Hibernate会采用默认值.要了解更多关于设置的内容,可以参
阅Hibernate文档的"5.1.9. property".
26.3.2 创建管理session的类:HibernateUtil
接下来创建一个关键的类:HibernateUtil,这个类用于管理session(生成,关闭).session
是Hibernate中最重要和使用最频繁的一个对象,实体对象都是通过它来和数据库交互.这个
session和JSP的session不是一回事,倒是有一点点类似于JDBC的Connection,但Session比
417
Connection包含的内容更多,功能范围更广.在Hibernate的编程中将不会再使用Connection,
而是通过session来和数据库交互.
HibernateUtil类的内容如下:
package cn.com.chengang.sms.db;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFac
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值