第37章 在Eclipse中使用Hibernate本章将把Hibernate应用到myweb项目中,对数据库层的代码进行改造,同时还会介绍一些Hibernate工具的使用。
37.1 概述37.1.1 持久化框架产生的背景和现状什么叫持久化?数据在内存中,关机后就会丢失。
而如果把数据保存到后台的数据库中,就能达到“持久”保存数据的目的。
而持久化框架的目的就是为了帮助用户更好地使用数据库。
在Java数据库项目中,由于数据库是关系型而非面向对象的。
很多时候,用面向对象方法完成了前期的设计和分析,到了数据库层编程时就会变得很别扭,其中最痛苦的就是写面向过程的SQL语句。
J2EE开发主要由JSP、Servlet、JavaBean和EJB 4部分组成。
其中EJB是J2EE中一个比较重要的部分,它提供了企业级开发所需的分布式支持。
但现实中的大部分项目都是单服务器的轻量级项目,一般都不会涉及分布式的开发环境,这时用EJB就像大炮打蚊子,蚊子没打到,房子却被打破个洞。
EJB的笨重和复杂一直让开发者很不满,其中EJB中Entity Bean受到的批评最多,现实项目中鲜有使用Entity Bean的成功范例。
开发者急切地需要一种符合Java编程习惯的、适合轻量级开发的、易于使用的数据库持久化解决方案。
在这个背景下就产生了轻量级的数据库持久化技术,其中最主要的就是Hibernate、JDO。
Hibernate是一个民间开源项目,有点像一个草莽英雄,但Hibernate从实用出发的设计思路,使得它脱颖而出成为最流行的持久化技术。
Hibernate的作者Gavin King也一举成名,现已成为EJB 3.0专家组的成员,并且在EJB 3.0的Entity Bean部分,将采用和Hibernate 类似的设计方案。
因此,Hibernate是开发者学习和使用持久化技术的一个比较好的选择,即使以后EJB 3.0一统天下,所学的Hibernate知识也不会浪费。
JDO 2.0是经JCP(Java规范管理委员会,由SUN、IBM、Oracle等共同参与)承认的一个正式规范,所以也受到了开发者很大的关注。
估计未来3年内,持久化技术将以EJB 3.0、Hibernate和JDO 2.0为主,成三足鼎立之势。
第37章 在Eclipse 中使用Hibernate·507·37.1.2 Hibernate 简介Hibernate 把开发者从数据库编程中隔离开来,它在数据库外裹了一层面向对象的外衣,Java 程序中所有进出数据库的操作都交给Hibernate 来处理,它会自动生成SQL 语句操作数据库。
有了Hibernate 后,程序员不再要写繁琐的SQL 语句,也不再要把实体对象一个个字段拆开又组装。
说通俗一点,Hibernate 就像一位卖苦力的民工,脏活累活它全包了。
图37.1是Hibernate 的示意图。
Hibernate 提供了一个和SQL 类似的HQL 语句,但结合Hibernate 后功能更强大,而且Hibernate 能够根据实体对象的状态来自动对数据库进行更新和插入,很智能化。
图37.1 Hibernate 的示意图HQL 语句操作数据库其实也是要转化成标准的SQL 语句的,Hibernate 根据用户所编写的XML 映射文件来实现HQL 到SQL 的自动转化。
XML 映射文件是Hibernate 中最关键的配置文件,它定义了实体类和数据表之间的关系,架起了两者间的桥梁,掌握XML 映射文件的编写是掌握Hibernate 的关键。
Struts 提供视图和控制层的支持,Hibernate 提供数据层的支持,两者是一个很不错的开发组合。
Struts 只能用于Web 开发,而Hibernate 还可用于Application (包括Eclipse 插件)的开发。
37.1.3 本章说明网上有Hibernate 的中文帮助文档(以后简称为Hibernate 文档),由国内的Hibernate 粉丝们翻译。
此Hibernate 文档内容权威而全面,加上翻译得也很不错,所以它是学习Hibernate 的必看文档。
读者可以用Google 搜索关键字“hibernate 3.2 中文”找到这份文档。
不足之处是:由于内容较多,主线不够突出,而且缺乏一个较为系统的实例。
Hibernate 的使用很灵活,但有一些用法是常用的、主要的,有一些则是生僻的、很少用的。
Hibernate 应该掌握的重点内容是:Session 概念、XML 映射文件的配置、HQL 的语法。
本章用一个实例做主线来贯穿这些Hibernate 的核心知识,读者可以顺着这条主线并结合Hibernate 文档来学习。
Eclipse 从入门到精通(第2版)·508· 本章的数据库表和数据模型来自于第4篇的实例代码。
37.2 Hibernate 的下载和安装37.2.1 下载具体步骤如下:(1)如图37.2所示,访问Hibernate 官方网站 ,单击左边菜单的Download 超链接,在下载页面中下载Hibernate Core 和Hibernate Tools 。
前者是Hibernate的核心软件包,后者是一个用于辅助Hibernate 开发的Eclipse 插件。
图37.2 Hibernate 的下载页(2)直正的下载页面会转到著名开源社区 ,如图37.3所示。
选择下载ZIP格式压缩包hibernate-3.2.2.ga.zip ,解压后的目标结构如图37.4所示。
图37.3 下载文件选择 图37.4 Hibernate 解压后的目标结构主要目录及文件解释:hibernate3.jar 文件是Hibernate 的核心jar 包。
lib 目录中有一些Hibernate 运行需要依赖的第三方jar 包,安装时也要用到。
src 目录中是Hibernate (hibernate3.jar )的源文件。
第37章在Eclipse中使用Hibernate ·509·etc目录中有一些可以参考的例子文件。
doc目录中包含Hibernate文档。
37.2.2 安装1.复制jar包将解压目录中的hibernate3.jar和lib目录下的jar包,全部复制到项目的Web-INF/lib目录,如果提示有同名文件(commons-logging-1.0.4.jar),覆不覆盖则都一样。
其他说明如下: 其实并不需要复制lib目录下的所有jar包,本文只是为了安装上的方便。
如果在正式发布程序时,希望只包括真正用到的包,则可以参考解压目录lib中的_README.txt,里面有详细描述。
或者参考Hibernate文档,里面也有部分描述。
注意不要将这些jar包复制到%TOMCAT_HOME%/common/lib目录下,那是Tomcat全局库所在目录,有可能引起包冲突。
检查一下lib目录中是否有重复包(不同版本),如有,则只保留一个最新版的包,否则很可能会引起类冲突。
因此要把antlr-2.7.2.jar删除,保留antlr-2.7.6.jar。
2.创建log4j.propertiesHibernate用log4j包来做日志输出,这就要求项目中创建一个log4j的配置文件log4j.properties,否则有些运行日志就无法看到(不会影响程序运行),另外Eclipse控制台视图会输出如下两条警告信息。
log4j:WARN No appenders could be found for logger (org.apache.catalina.startup.TldConfig).log4j:WARN Please initialize the log4j system properly.如果读者熟悉log4j,可以自己创建log4j.properties,定义自己想要的日志配置。
如果不熟悉log4j,可以直接将解压目录etc下的log4j.properties,复制到项目的“Java Resourcess:src”下。
注意,由于J2EE透视图拒绝直接复制文件到“Java Resourcess:src”下,所以可以转到Java透视图再复制。
37.3 一个简单的Hibernate实例(V005)37.3.1 创建Hibernate配置文件:hibernate.cfg.xml在“Java Resourcess:src”下创建一个hibernate.cfg.xml文件如下。
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration>Eclipse 从入门到精通(第2版)·510· <session-factory><!-- 数据库 --><property name="connection.datasource">java:comp/env/jdbc/mysql</property><property name="dialect">org.hibernate.dialect.MySQL5Dialect</property><property name="show_sql">true</property><!-- 打开Hibernate 的session 自动管理机制 --><property name="current_session_context_class">thread</property><!-- 把所有*.hbm.xml 文件注册在这里 --><mapping resource="cn/com/chengang/sms/model/model.hbm.xml"/></session-factory></hibernate-configuration>配置说明:connection.datasource 设定所用的连接池。