贯通Hibernate开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第3章 Hibernate的安装与配置

【本章知识导学】

本章主要讲解用Eclipse进行Hibernate应用开发时如何搭建开发环境,以及Hibernate的安装与配置。

3.1 开发环境介绍

进行Hibernate应用程序开发,需要使用相关的集成开发工具、应用(Web)服务器以及关系型数据库系统。集成开发工具用于编写和调试代码,应用(Web)服务器则作为应用程序的运行容器,数据库更是必不可少。因此,本章将分别以Eclipse、Tomcat、SQLServer2000为例,对开发环境中的这三个要素进行简要介绍。

3.1.1 Eclipse

Eclipse最初是IBM投入了4000万美金所开发的一个软件产品,是替代IBM Visual Age for Java的下一代IDE开发环境,但它未来的目标不仅仅是成为专门开发Java程序的IDE环境。根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。2001年11月,IBM宣布将其捐给开放源代码组织Eclipse.org,使得Eclipse成为一个开放源代码的项目,任何人都可以下载Eclipse的源代码,并且在此基础上开发自己的功能插件。这些特点使得目前Eclipse的市场占有率已经完全超过了Borland公司的JBuilder,成为Java开发平台中的主流。

Eclipse坚持“一切皆为插件”的设计思想。它自身的核心是非常小的,其他所有的功能都以插件的形式附加到核心上。任何人都可以利用它所支持的不同的开发语言设计、开发自己的功能插件,使得Eclipse可以无限扩展,并且保持统一的外观、操作和系统资源管理,这也正是Eclipse的生命力所在。

Eclipse平台是一个拥有强大开发功能的开放的集成开发工具。它是建立在插件机制之上的,这些插件比如Java开发环境插件(JDT)、插件开发环境(PDE)和其他第三方插件。Eclipse平台可以为开发者提供将各种工具无缝集成的功能,并为集成软件开发工具的开发、构造和运行提供基础模块,拥有一整套的公共服务集。它由几个主要的部分构成:平台运行库、工作区、工作台、团队支持和帮助。

平台运行库是内核,它在启动时检查已安装了哪些插件,并创建关于它们的注册表信息。它只有在需要一个插件时才加载此插件,这样可以缩短启动时间和减少资源使用。内核是最核心的部分,除了内核外,其他各个部分都是作为内核的插件来实现的。

工作区是负责管理用户资源的插件。管理的用户资源包括用户创建的项目、项目中的文件、文件变更和其他资源。工作区还负责通知其他插件关于资源变更的信息,比如文件创建、修改或者删除。

工作台是为Eclipse提供用户界面的插件。它是使用标准窗口工具包(SWT)和一个更高级的API (JFace)来构建的;SWT是Java的Swing/AWT GUI API的非标准替代者,JFace则建立在SWT基础上,提供用户界面组件。SWT比Swing或AWT更紧密地映射到底层操作系统的本机图形功能,这不仅使得SWT更快速,而且使得Java程序具有更像本机应用程序的外观和感觉。使用这个新的GUI API可能会限制Eclipse工作台的可移植性,不过针对大多数流行操作系统的SWT移植版本已经足够了。Eclipse对SWT的使用只会影响Eclipse自身的可移植性--使用Eclipse构建的任何Java应用程序都不会受到影响,除非它们使用SWT而不是使用Swing/AWT。

团队支持组件负责提供版本控制和配置管理支持。它根据需要添加视图,允许用户与所使用的任何版本控制系统交互。大多数插件都不需要与团队支持组件交互,除非它们提供版本控制服务。

帮助组件主要用于帮助文档,它提供了一个附加的导航结构,允许工具以HTML文件的形式添加文档,从而使得帮助组件具有与Eclipse平台本身相当的可扩展能力。

3.1.2 Tomcat

Tomcat是Apache Jakarta软件组织的一个核心项目,Tomcat是一个开放式源码、免费支持JSP和Servlet技术的容器,它是在Sun公司的JSWDK(Java Server Web Development Kit)基础上发展起来的一个JSP和Servlet规范的标准实现。经过多年的发展,Tomcat具备了很多商业Java Servlet容器的特性,并被一些企业用于商业用途。Tomcat被JavaWorld杂志的编辑选为2001年度最具创新的Java产品,可见其在业界的地位。

Tomcat中的应用程序是一个WAR(Web Archive)文件。WAR是Sun提出的一种多个文件压缩包形式的Web应用程序格式。这个包中的文件拥有一定的目录格式,它的根目录有一个WEB-INF目录,还包含有HTML和JSP文件或者包含这两种文件的目录。在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和JSP或Servlet所依赖的其他类(如JavaBean)。通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便。

在Tomcat中,应用程序的部署很简单,只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。在浏览器中访问这个应用的JSP时,首先Tomcat要将JSP转化为Servlet文件,然后编译,所以速度较慢。但编译以后,以后再次访问速度将会很快。Tomcat也提供了一个应用:manager,需要通过用户名和密码访问此应用,用户名和密码存储在一个xml文件中。通过这个应用,辅助于FTP,你可以在远程通过Web部署和撤消应用。

Tomcat不仅仅是一个Servlet容器,它也具有传统的Web服务器的功能。Tomcat内建的Web服务器是一个高效的HTTP1.1服务器,只要合理配置,处理静态的内容速度非常快。它具有一般Web服务器的全部功能,如支持CGI脚本,服务端包含(SSI),站点路径的映射等。

Tomcat还提供Realm支持。Realm类似于Unix里面的group。在Unix中一个group对应着系统的一定资源,某个group不能访问不属于它的资源。Tomcat用Realm来对不同的应用赋给不同的用户,没有权限的用户则不能访问这个应用。Tomcat提供三种Realm:第一种是JDBCRealm,这个Realm将用户信息存在数据库里,通过JDBC获得用户信息来进行验证。第二种是MemoryRealm,用户信息存在一个xml文件里面,上面讲的manager应用验证用户时即使用此种Realm。第三种是JNDIRealm,用户信息存在基于LDAP的服务器里,通过JNDI获取用户信息。通过Realm程序员可以方便地对访问某个应用的客户进行验证。

在Tomcat4及以后版本中,程序员还可以利用Servlet2.3提供的事件监听器功能,来对应用或者Session实行监听。Tomcat也提供其他的一些特征,如与SSL集成到一块,实现安全传输。还有Tomcat也提供JNDI支持,这与那些J2EE应用服务器提供的是一致的。

基于Tomcat的开发其实主要是JSP和Servlet的开发。开发JSP和Servlet非常简单,程序员可以用普通的文本编辑器或者IDE,然后将其打包成WAR即可。这里要提到另外一个工具Ant,Ant也是Jakarta中的一个子项目,是一种基于Java的build工具。理论上来说,Ant有些类似于(Unix)C中的make,但没有make的缺陷。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去,所以,程序员经常把Ant集成到Tomcat中进行使用。程序员需要写一个build.xml文件,然后运行Ant就可以完成xml文件中定义的工作,这个工具对于一个大的应用来说非常有效,程序员只需在xml中写很少的东西就可以将其编译并打包成WAR。事实上,在很多应用服务器的发布中都包含了Ant。关于Ant的简单应用,将在第四章中进行介绍。另外,在JSP1.2中还可以利用标签库实现Java代码与HTML文件的分离,从而使得JSP的维护更方便。

Tomcat也可以与其他一些软件集成起来实现更多的功能。如与JBoss集成起来开发EJB,与Cocoon (Apache的另外一个项目)集成起来开发基于Xml的应用,与OpenJMS集成起来开发JMS应用。除了本书提到的这几种之外,可以与Tomcat集成的软件还有很多。

3.1.3 Microsoft SQL Server

SQL Server是一个关系数据库管理系统。它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,于1988年推出了第一个OS/2版本。在Windows NT推出后,Microsoft将SQL Server移植到Windows NT系统上,专注于开发推广SQL Server的Windows NT版本。Sybase则较专注于SQL Server在UNIX操作系统上的应用。

SQL Server是一套完整的数据库和分析产品,具有使用方便、可伸缩性好以及与相关软件集成程度高等优点,可迅速提供下一代可扩展电子商务、各种业务和数据仓库解决方案,完全支持Web,通过Web可以查询、分析和处理数据。在SQL Server中使用可扩展标记语言(XML)可以在松散耦合系统之间交换数据。

不可否认,说到真正的企业特性,尤其是在高可用性和灾难恢复方面,SQL Server总是比不上Oracle数据库。Oracle凭借联机重建索引、基于快照的恢复和故障替换时进行日志传送等特性,能够满足24×7的关键业务型操作,而SQL Server要是没有第三方解决方案的帮助,则无法提供真正的零数据丢失。对不需要上述这些保护的客户而言,SQL Server提供了可靠稳定的数据库,而且许可费比较低。

不过,目前SQL Server有了明显的改观,已经进化到SQL Server 2008,新的系统不但克服了高可用性和灾难恢复方面的缺点,而且几乎在各个方面都有了改进:管理任务得到了简化;监控和诊断功能得到了增强;默认的锁定配置、数据加密及其他新特性增强了安全。与Visual Studio和.Net/CLR的集成,把SQL Server的内部机制展现给了.Net开发人员,同时也把.Net的内部机制展现给了SQL开发人员。这意味着,现在就可以将.Net的强大功能,用于存储过程、数据流和数据转换、商业智能等应用;还提高了系统的性能。除了让数据库管理员对数据库进行分区并实现负载均衡外,微软还在改进内存管理、索引策略和查询优化方面做了大量工作。

3.1.4 本书的相关约定

本书所用的开发工具、JDK、数据库等内容如表3-1所示,其中的数据对相关工具的版本进行了说明。

表3-1 本书的相关约定

3.2 开发环境的搭建

对于初学者来说,配置环境可能会感到比较麻烦,往往会在这方面浪费很多时间。在此节读者将从零开始,一步一步来建立Hibernate的开发环境。

3.2.1 搭建开发平台

开发平台以JDK和Eclipse为基础,所以应先下载这些软件。本书所采用的版本及下载地址如表3-2所示。

表3-2 软件的版本及下载地址

为了方便使用Eclipse,本书使用wtp版本,wtp「Web Tools Platform」项目在eclipse平台上进行扩展,是一个开发J2EE Web应用程序的工具集。本文所有使用的wtp版本为wtp-all-in-one-sdk-R-1.5.3,下载地址为http://www.bea.com/distros/eclipse.html

1.安装JDK

软件获取后,需要先安装JDK,安装步骤如下:

:双击可执行程序(j2sdk-1_4_2_08-windows-i586-p.exe)开始安装。

:然后一直单击Next按钮,直至出现如图3-1所示的界面,选择JDK的安装路经,读者可单击更改安装路径。在此读者选择默认安装,将其安装到c:\j2sdk1.4.2_08。

图3-1 JDK安装界面

:继续安装直至完成。此时需要重启操作系统。

2.设置环境变量

JDK安装成功之后,需要设置其环境变量,否则开发还是无法进行,设置步骤如下。

:在Windows XP中,选中“我的电脑”,单击鼠标右键,在弹出快捷菜单中选择“属性”,显示“系统属性”对话框。

:选择“高级”选项卡,单击“环境变量”按钮,显示“环境变量”对话框,如图3-2所示。

图3-2 设置JDK的环境变量

:在“系统变量”列表框中,单击“新建”按钮,按照表3-3列出的环境变量名及环境变量值来创建所需的环境变量。

表3-3 环境变量设置值

3.安装SQL Server 2000开发版

SQL Server 2000的安装程序员应该经常用到,这里只是简单介绍一下安装步骤,首先启动SQL Server 2000开发版安装光盘,运行Setup文件。

:选择本地计算机,如图3-3所示,单击“下一步”按钮鼠标。

图3-3 选择计算机类型

:选择创建新的SQL Server示例,或安装“客户端工具”,如图3-4所示,单击“下一步”按钮。

图3-4 选择数据库安装类型

:选择服务器和客户端工具,如图3-5所示,单击“下一步”按钮。

图3-5 选择安装类型

:选择安装类型,本书选择的是默认的安装路径和安装类型,如图3-6所示,单击“下一步”按钮。

图3-6 选择安装位置

:选择服务账户的类型为“对每个服务使用同一个账户”,服务设置选择“使用本地系统账户”,如图3-7所示,单击“下一步”按钮。

图3-7 选择服务账户

:身份验证模式选择“混合模式”,sa密码本书设置为“sa”,如图3-8所示,单击“下一步”按钮,安装完成。

图3-8 选择身份验证模式

注意一点的是,SQL Server 2000一定要安装SP4的补丁,相关补丁的安装本书不再说明,如果不安装SP4的补丁,将会影响后面程序的运行。

4.安装Eclipse

通过Eclipse的官方网站:www.eclipse.org,程序员可以获得Eclipse的持续更新版本,为了方便使用Eclipse,本书使用wtp版本,下载地址为http://www.bea.com/distros/eclipse.html。下载参考页面如图3-9所示,选择版本为wtp-all-in-one-sdk-R-1.5.3。其中的Eclipse的版本为3.2。

图3-9 Eclipse下载页面

:下载后为名为“wtp-all-in-one-sdk-R-1.5.3-win32.zip”的压缩文件,直接把它解压到C盘根目录,使eclipse目录成为C盘的根目录,如图3-10所示。

图3-10 Eclipse安装目录

:启动Eclipse,设置Workspace目录位置为默认位置,如图3-11所示。

图3-11 Eclipse Workspace目录

到此为止,Eclipse安装完成。

3.2.2 下载Hibernate

通过Hibernate的官方网站:www.hibernate.org,程序员可以获得Hibernate的持续更新版本,目前Hibernate发布的最新版本是Hibernate 3.2.5,程序员通过该网站可以获得大量有用的信息和资源。读者也可到网址http://sourceforge.net下载本书所使用的Hibernate 3.1.2的安装文件hibernate-3.1.2.zip,下载完成后解压缩备用即可。网址http://sourceforge.net上的下载参考页面如图3-12所示。

图3-12 hibernate下载页面

3.2.3 设置用户库

Hibernate下载之后,不需要安装,要想使用它,必须将Hibernate库导入到用户库中,方法如下:

:在Eclipse中,单击“Window”菜单,选择“Preferences”。

:在左侧目录树中单击“Java”/“Build Path”/“User Libraries”,显示“User Libraries”界面,如图3-13所示。

图3-13 用户库列表界面

:单击“New”按钮,弹出图3-14所示的“New User Libraries”对话框,在文本框中输入用户库名称hibernate3.1(当然也可以输入其他名字),单击“OK”按钮,如图3-14所示。

图3-14 新增用户库

:单击“Add JARs”按钮,显示“JAR Selection”界面,将下载解压后的Hibernate根目录下的Hibernate3.jar选中,选择“打开”按钮,将这个Jar加入到刚才定义的用户库中,如图3-15所示。

图3-15 将Hibernate3.jar加入用户库(必需)

:按照同样的方法,将lib目录下的所有Jar文件选中,添加到刚才的用户库中,如图3-16所示。

图3-16 加入Hibernate解压目录lib下的jar包

这样Hibernate的驱动基本加载完毕。

为了使用SQL Server 2000,程序员需要加载SQL Server 2000的驱动,SQL Server 2000的JDBC的驱动可以从www.microsoft.com下载,具体的下载网址为http://www.microsoft.com/downloads/details.aspx? FamilyID=07287b11-0502-461a-b138-2aa54bfdc03a&DisplayLang=en,下载“SQL Server 2000 Driver for J DBC Service Pack 3”的网页。选择下载setup.exe文件即可,如图3-17所示。

图3-17 数据库驱动下载页面

:单击Setup,选择完全安装,单击“下一步”按钮。如图3-18所示。

图3-18 数据库驱动安装界面

:安装完毕后,数据库驱动的默认安装位置为C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC\lib。按照同样的方法,将lib目录下的所有Jar文件选中,添加到刚才的用户库中,如图3-19所示。数据库驱动加载完成。

图3-19 加入数据库驱动

这样一个用户库文件就建好了,如果要更新Eclipse时,可以先将其导出,然后再导入即可,这样做可以使得对库文件的管理更便捷。

至此,读者就完成了开发Java项目环境的搭建。

3.3 Hibernate配置

Hibernate之所以能在各种不同的环境下工作,这得益于大量的配置参数。Hibernate配置文件提供了Hibernate运行时所需各种参数的配置。配置样例文件Hibernate.properties随Hibernate一同分发,此文件位于发行包的etc文件夹下。

3.3.1 Hibernate配置文件

Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性。Hibernate配置文件允许传统的hibernate.properties文件和hibernate.cfg.xml文件同时存在。Hibernate配置文件的存放位置为类文件的根目录,即通常的WEB-INF目录。Hibernate初始化时到类文件的根目录下寻找这个文件并读取其中的配置信息,其中xml格式文件的优先级高于properties格式文件,也就是说如果两个文件同时存在,则hibernate.cfg.xml的配置会起作用,而hibernate.properties的配置则会被屏蔽。

本书建议使用xml格式的配置文件,因为此类型的配置文件提供了更易阅读的结构和更强的配置能力,可以由Hibernate自动加载;而properties文件必须在程序中通过编码进行映射文件的加载。

一个典型的hibernate.cfg.xml文件内容如下所示:

    <?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>
    <!--Sessionfactory配置-->
    <session-factory>
    <!--   数据库连接设置   -->
    <property name="connection.driver class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:8080/mynewsql</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>

      <!--JDBC连接池 -->
    <property   name="connection.pool size">1</property>

    <!--SQL 方言-->
    <property   name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <!--Hibernate自动的Session上下文管理-->
    <property name="current session context class">thread</property>

    <!--Hibernate的二级缓存-->
    <property   name="catch.provider class">org.hibernate.cache.NoCacheProvider</property>

    <!-是否将运行期生成的SQL输出到日志以供调试-->
    <property   name="show sql">true</property>

    <!--映射资源,配置文件必须包含其相对的全路经-->
    <mapping   resource="studentinfo/entitybean/Book.hbm.xml" />

    </session-factory>
    </hibernate-configuration>

Hibernate.cfg.xml文件是一个标准的XML文档,它有自己的DTD文件。DTD文件的详细地址程序员可以直接从hibernate.cfg.xml文件的文件头中看到,该文件在本地也会存在,当网络出现问题时,系统会按照路径自动去寻找该DTD文件。以下是该DTD文件对hibernate.cfg.xml文件格式的描述:

文件hibernate-configuration-3.0.dtd

    <!-- Hibernate file-based configuration document.
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    该文档结构定义的一个示例(即指一个名为hibernate.cfg.xml或其他名字的Hibernate的XML格式的配置文件)包含下列属性设置
    和映射文件参考,用于创建一个或多个SesstionFactory示例。
    -->
    <!ELEMENT hibernate-configuration (session-factory,security?)>

    <!ELEMENT property (#PCDATA)>
    <!ATTLIST property name CDATA #REQUIRED>
    <!ELEMENT mapping EMPTY> <!-指向映射文件 -->
    <!ATTLIST mapping resource CDATA #IMPLIED>
    <!ATTLIST mapping file CDATA #IMPLIED>
    <!ATTLIST mapping jar CDATA #IMPLIED>
    <!ATTLIST mapping package CDATA #IMPLIED>
    <!ATTLIST mapping class CDATA #IMPLIED>

    <!ELEMENT class-cache EMPTY>
    <!ATTLIST class-cache class CDATA #REQUIRED>
    <!ATTLIST class-cache region CDATA #IMPLIED>
    <!ATTLIST class-cache usage (read-only|read-write|nonstrict-read-write|transactional) #REQUIRED>
    <!ATTLIST class-cache include (all|non-lazy) "all">

    <!ELEMENT collection-cache EMPTY>
    <!ATTLIST collection-cache collection CDATA #REQUIRED>
    <!ATTLIST collection-cache region CDATA #IMPLIED>
    <!ATTLIST collection-cache usage (read-only|read-write|nonstrict-read-write|transactional) #REQUIRED>

    <!ELEMENT event (listener*)>
    <!ATTLIST event type
    (auto-flush|merge|create|delete|dirty-check|evict|flush|flush-entity|load|load-collection|lock|refresh|replicate|save
    -update|save|update|pre-load|pre-update|pre-insert|pre-delete|post-load|post-update|post-insert|post-delete|post
    -commit-update|post-commit-insert|post-commit-delete) #REQUIRED>

    <!ELEMENT listener EMPTY>
    <!ATTLIST listener type
    (auto-flush|merge|create|delete|dirty-check|evict|flush|flush-entity|load|load-collection|lock|refresh|replicate|save
    -update|save|update|pre-load|pre-update|pre-insert|pre-delete|post-load|post-update|post-insert|post-delete|post
    -commit-update|post-commit-insert|post-commit-delete) #IMPLIED>
    <!ATTLIST listener class CDATA #REQUIRED>
    <!ELEMENT session-factory (property*, mapping*, (class-cache|collection-cache)*, event*, listener*)>
    <!ATTLIST session-factory name CDATA #IMPLIED> <!-session-factory标价包含前面定义的property,mapping,event等
    标记 -->

    <!ELEMENT security (grant*)>
    <!ATTLIST security context CDATA #REQUIRED> <!--the JACC contextID-->

    <!ELEMENT grant EMPTY>
    <!ATTLIST grant role CDATA #REQUIRED>
    <!ATTLIST grant entity-name CDATA #REQUIRED>
    <!ATTLIST grant actions CDATA #REQUIRED>

在该hibernate.cfg.xml文件的定义中,一套Configuration的配置被包括在一对

<hibernate-configuration>标记中,在<hibernate-configuration>中可以包含多个用于创建SessionFactory示例的<session-factory>标记,每一个SessionFactory可以连接不同的数据源。但是建议开发者在一个配置文件中定义一个SessionFactory,可以将多个SessionFactory分别定义在不同的配置文件中,然后在程序中动态加载多个配置文件(hibernate.cfg.xml为默认的配置文件)。

在<session-factory>标记中定义了若干常用的属性标记<property>,具体含义如表3-4所示。

表3-4 session-factory常用属性配置

另外,在<session-factory>中还定义了一个<mapping>标记,该标记可以有零到多个,其source属性指向实现对象-关系映射的映射文件,这些文件应与持久化类处于同一级目录,也就是说应该位于同一个包(package)内。

通过这个简单的例子,读者就可以启动一个Hibernate程序了,Configuration已经获得了最基本的配置。关于其他可选的配置方式,请参见以后章节。

关于Hibernate的SQL方言,可以根据底层数据库选取如表3-5中所示的数值。

表3-5 Hibernate的常用SQL方言

【提示】

Configuration是启动期间对象,一旦SessionFactory被创建完成,它便结束了其生命周期。

3.3.2 可编程的配置方式

使用Hibernate配置文件,只需对各种参数进行相应配置,不需要编写任何程序,Hibernate运行时会自动加载这些参数的配置。使用配置文件只是配置Hibernate启动属性的一种方式,除此之外,程序员还可以通过编码方式实现,这就是所谓的可编程的配置方式。

Hibernate提供的Configuration类用来管理Hibernate的配置信息,并根据指定的配置信息创建特定的SessionFactory示例。程序员可以构建一个Configuration的示例,直接示例化它即可:

        Configuration  cfg=  new Configuration()

Configuration在示例化时,默认情况下将加载classpath(类路径)中的hibernate.cfg.xml文件或hibernate.properties文件,当然程序员也可以指定需要加载的配置文件,示例如下:

        Configuration  cfg=  new Configuration()
            .addFile("Item.hbm.xml")
            .addFile("Bid.hbm.xml")

该示例将添加位于classpath根目录下的Item.hbm.xml文件和Bid.hbm.xml文件。

在示例化时程序员可以按照上面的方式指定映射配置文件,另一种方法程序员可以指定被映射的类,也即以class形式加载,示例如下:

    Configuration  cfg=  new Configuration()
        .addClass("src/Item.class")
        .addClass("src/Bid.class")

Hibernate会在classpath中寻找名为src/ Item.hbm.xml和src/ Item.hbm.xml的映射定义文件,也就是说classpath根目录下的src路径下必须存在Item.hbm.xml和Bid.hbm.xml映射文件定义。这种方法取消了所有对文件名的硬编码。

当所有的映射都被Configuration解析之后,应用程序为了得到Session示例,必须先得到它的工厂。这个工厂应该是被应用程序的所有线程共享:

    SessionFactory sessions= cfg.buildSessionFactory();

Configuration示例cfg会根据当前的数据库配置信息来构造SessionFactory示例,SessionFactory一旦构造完毕,即被赋予特定的配置信息。Configuration是仅在配置期使用的对象,从第一个SessionFactory示例创建的时候,它就失效了,也就是说,之后cfg的任何改变将不再影响到已经创建的SessionFactory示例,如果需要使用基于改动后的cfg示例的SessionFactory ,那么需要从cfg重新构建一个SessionFactory示例。

Hibernate允许应用程序创建多个SessionFactory示例,每个SessionFactory示例对应着一个需要访问的数据库。由于SessionFactory采取了线程安全的设计,可由多个线程并发调用,在大多数情况下,一个应用中针对一个数据库共享一个SessionFactory示例即可。

3.3.3 可选的配置属性

在配置Hibernate属性时,有大量属性是可选的,它们都有适当的默认值来控制Hibernate运行期的行为。表3-6列出了Hibernate配置的一些可选属性。

表3-6 Hibernate配置属性

3.3.4 日志配置

Hibernate使用Apache common logging组件来为各种事件记录日志。Hibernate发行包的etc目录下附带了一个日志示例文件log4j.properties,对于Eclipse来说,可将此文件放在源代码目录下便于修改。

此配置文件默认配置开启了大多数日志选项,这可能导致运行时监控界面上的日志信息看起来比较混乱,为此程序员可只指定输出较为严重的错误信息及Hibernate生成的SQL语句。

    log4j.appender.stdout= org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target= System.out
    log4j.appender.stdout.layout= org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    log4j.rootLogger=warn, stdout
    ###只输出hibernate运行过程中的错误日志
    log4j.logger.net.sf.hibernate=error

3.3.5 数据库连接池配置

在数据库连接池出现以前,每执行一次数据库操作,程序员便会在应用程序中为其创建一个数据库连接,用完后再释放。若数据库操作非常频繁,甚至由于编程失误,忘记释放数据库连接,就会导致系统性能降低以至于发生内存溢出的致命错误。连接池的出现,为开发过程提供了一个很好的管理平台。当程序中需要建立数据库连接时,只需从连接池中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都由连接池自身来管理。同时,程序员还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同时,程序员可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。Hibernate同样也支持使用数据库连接池,并且赋予其更方便和灵活的使用方式。

Hibernate的连接池有三种使用方式,分别介绍如下:

1.使用Hibernate自带的连接池

Hibernate自带的连接池性能不高,缺乏响应大批量请求以及容错的能力,甚至还有bug,在项目运用中不值得推荐,在这里本书仅给出配置方法,以供参考,如下代码所示:

    <hibernate-configuration>
    <session-factory >
    <!--JDBC驱动程序-->
    <property name="hibernate.connection.driver_class">
        com.microsoft.jdbc.sqlserver.SQLServerDriver
    </property>
    <!-- 连接数据库的URL-->
    <property name="hibernate.connection.url">
    jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=HibernateWizard;SelectMethod=Cursor
    </property>
    <!--连接的登录名-->
    <property name="hibernate.connection.username">sa</property>
    <!--登录密码-->
    <property name="hibernate.connection.password">sa</property>
    <!--是否将运行期生成的SQL输出到日志以供调试-->
    <property name=" hibernate.show sql">true</property>
    <!--指定连接的语言-->
    <property name=" hibernate.dialect">org.hibernate.dialect.SQLServerDialect </property>
    <!--映射资源-->
    <mapping resource="/xx/xx.hbm.xml" />
    </session-factory>
    </hibernate-configuration>

这种方式通过直接设置hibernate.connection.driver_class、hibernate.connection.url这两个属性进行数据库的连接,Hibernate便会启动自带的连接池进行数据库连接的管理。

2.使用配置文件指定的数据库连接池配置

业界经常使用而且性能最稳定的第三方连接池主要有两个:C3P0和Proxool,读者先来了解连接池C3P0配置,在写入配置文件之前,用户必须将c3p0-0.8.4.5.jar这个包放入classpath当中,下面给出其核心配置项,其他的配置项可参见上面的方式:

    <property name="c3p0.min size">5</property> <!-在连接池中可用数据库连接的最小数目-->
    <property name="c3p0.max size">30</property> <!--在连接池中所有数据库连接的最大数目-->
    <property name="c3p0.time out">1800</property> <!-设定数据库连接的超时时间-->
    <property name="c3p0.max statement">50</property> <!-可以被缓存的PreparedStatement的最大数目-->

把上面的配置项添加到hibernate.cfg.xml中就可以了。

由于Proxool连接池只管理自己产生的连接,所以我的做法是单独建立一个XML文件来管理连接池,并在Hibernate里面设置相关的项,从而让Hibernate与Proxool关联起来。

首先要把proxool-0.8.3.jar这个包放入classpath,再建立一个ProxoolConf.xml文件,建议将其与hibernate.cfg.xml文件放在一起。内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <something-else-entirely>
    <proxool>
    <alias>testPool</alias> <!-连接池的别名可以随便写,但注意的是后面在hibernate部分要对应-->
    <!--proxool只能管理由自己产生的连接-->
    <driver-url>
    jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=HibernateWizard;SelectMethod=Cursor </driver-url>
    <driver-class> com.microsoft.jdbc.sqlserver.SQLServerDriver </driver-class>
    <driver-properties>
    <property name="user" value="sa"/>
    <property name="password" value="sa"/>
    </driver-properties>
    <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁-->
    <house-keeping-sleep-time>90000</house-keeping-sleep-time>
    <!--指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->
    <maximum-new-connections>20</maximum-new-connections>
    <!-- 最少保持的空闲连接数-->
    <prototype-count>5</prototype-count>
    <!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由 maximum-new-connections 决定
    -->
    <maximum-connection-count>100</maximum-connection-count>
    <!-- 最小连接数-->
    <minimum-connection-count>10</minimum-connection-count>
    </proxool>
    </something-else-entirely>

然后需要在hibernate.cfg.xml中作配置,参考如下:

    <property name="proxool.pool alias">testPool</property>
          <!-数据源名称-->
    <property name="proxool.xml">ProxoolConf.xml</property>
          <!-Proxool配置文件-->
    <property name="connection.provider class">
    org.hibernate.connection.ProxoolConnectionProvider
    <!-数据库连接池提供者-->
    </property>

3.从容器中获取得到连接池

本书以Tomcat为例来描述,Hibernate想要从Tomcat中获取数据源,需要对Tomcat容器与Hibernate分别进行配置。

首先需要在容器中配置数据源,应对Tomcat的server.xml和web.xml文件进行配置,具体的配置如下:

server.xml

    <Context path="" docBase="" debug="0" >
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <Resource name="JNDI/HibernateWizard"  auth="Container"
        type="javax.sql.DataSource" driverClassName="net.sourceforge.jtds.jdbc.Driver"
        url="jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=HibernateWizard"
        username="sa" password="sa" maxActive="100" maxIdle="10"  maxWait="-1"/>
    </Context>

web.xml

    <resource-ref>
        <description>Oracle Datasource example</description>
        <res-ref-name>JNDI/HibernateWizard </res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

然后在hibernate.cfg.xml中指定使用容器中的数据源,使之取代以前所定义的JDBC连接配置。代码如下所示:

        <property name="hibernate.connection.datasource">
java:/comp/env/JNDI/HibernateWizard
        </property>

3.4小结

Eclipse是一种方便实用的集成开发环境,利用多种插件可以方便地进行Hibernate应用的开发,因此本书选用Eclipse作为开发工具。

Hibernate的SessionFactory是Hibernate运行的核心组件。Hibernate为SessionFactory一些运行时属性的配置提供了便利的方式,即通过hibernte.cfg.xml或hibernate.properties配置文件进行参数配置,这些配置是Hibernate应用运行的基础。一般情况下,hibernate.cfg.xml的应用较为广泛,除特殊说明外,本书所提到的配置文件均为hibernte.cfg.xml。

数据库连接池为提高程序性能提供了方便机制,Hibernate可以采取三种方式配置数据库连接池,应掌握这几种配置方法,并适当选择数据库连接池。

3.5 习题

(1)练习Eclipse的使用。

(2)试搭建一个基本的Eclipse+Hibernate的开发环境。

(3)试编写一个具有最基本配置的Hibernate配置文件,并将其放置在开发环境中进行测试。

(4)试创建一个Tomcat的数据库连接池,并将Hibernate的数据库连接池改为Tomcat提供的连接池。