這個(gè)實(shí)例主要演示如何使用MyEclipse的可視化開發(fā)工具開發(fā)Hibernate應(yīng)用,利用MyEclipse可以提高我們開發(fā)JavaEE應(yīng)用的效率。操作的數(shù)據(jù)庫(kù)表還是guestbook表,所使用MyEclipse的版本為7.0,不同的MyEclipse版本之間對(duì)于開發(fā)Hibernate應(yīng)用差異不大。
在7.0版本中,內(nèi)置了對(duì)Hibernate2.x、3.0、3.1和3.2等Hibernate版本的支持,沒有提供對(duì)3.3版本的支持。我們可以修改MyEclipse的設(shè)置,把對(duì)Hibernate3.2的支持,修改為對(duì)Hibernate3.3的支持。為此啟動(dòng)Eclipse后,選中菜單欄的"Windows"→"Preference"→"MyEclipseEnterprise Workbench"→"Project Capabilities"→"Hibernate"→"Hibernate3.2"選項(xiàng),在Library Modules下拉列表框中選中Hibernate 3.2 CoreLibray選項(xiàng),把類庫(kù)文件替換為Hibernate 3.3的類庫(kù)文件。如圖2 2所示。
圖2 2 修改MyEclipse中Hibernate3.2的類庫(kù)文件
2.7.1 設(shè)置MyEclipse連接Oracle數(shù)據(jù)庫(kù)
為在MyEclipse中設(shè)置連接Oracle數(shù)據(jù)庫(kù),在Eclipse中選擇Window→ShowView→Other→MyEclipse Database→DB Browser選項(xiàng)。右擊DBBrowser視圖的空白部分,選擇New選項(xiàng),如圖2 3所示。
圖2 3 選擇New選項(xiàng)
在彈出的窗口中,輸入連接Oracle數(shù)據(jù)庫(kù)所需要的相應(yīng)參數(shù),以及Oracle驅(qū)動(dòng)類庫(kù)的文件名與位置。單擊Next按鈕,如圖24所示。
圖2 4 輸入連接Oracle數(shù)據(jù)庫(kù)的參數(shù)
在Schema Details窗口中,選中DisplaySelected單選按鈕。單擊"Add"按鈕,在彈出的SelectionNeeded窗口中選中SCOTT復(fù)選框。單擊"OK"按鈕,如圖2 5所示。單擊"Finish"按鈕,關(guān)閉SchemaDetails窗口。
圖2 5 選擇SCOTT復(fù)選框
2.7.2 新建項(xiàng)目并增加Hibernate開發(fā)支持
在Eclipse中新建一個(gè)Java項(xiàng)目,名為"chapter02_first"。單擊MyEclipse→ProjectCapabilities→Add Hibernate Capabilites選項(xiàng),增加Hibernate的開發(fā)支持,如圖26所示。
圖2 6 增加Hibernate的開發(fā)支持
彈出Hibernate Support for MyEclipse窗口,在HibernateSpecification選項(xiàng)組中選中Hibernate 3.2單選按鈕,選擇MyEclipseLibraries和Hibernate 3.2 CoreLibaries-<MyEclipse-Library>復(fù)選框選項(xiàng),如圖27所示,單擊Next按鈕。
圖2 7 選擇Hibernate類庫(kù)的版本
其中的選項(xiàng)說明如表2-3所示。
表2-3 選項(xiàng)說明
選項(xiàng)
描述
HibernateSpecification
要添加到項(xiàng)目中的Hibernate具體版本,推薦選擇Hibernate 3.2
Enable HibernateAnnotations Support
是否需要HibernateAnnotations的支持
MyEclipseLibraries/User Libraries
選擇顯示哪個(gè)位置的類庫(kù)
Add checked Librariesto project build-path
選中的類庫(kù)將會(huì)添加當(dāng)前項(xiàng)目的構(gòu)建路徑中,但是相應(yīng)的Jar文件將不會(huì)復(fù)制到項(xiàng)目中,這些Jar文件會(huì)在項(xiàng)目部署時(shí)復(fù)制
Copy checked LibraryJars to project folder and add to build-path
選中的類庫(kù)中的Jar文件將會(huì)被復(fù)制到項(xiàng)目并添加到構(gòu)建路徑中
LibraryFolder
一個(gè)相對(duì)于當(dāng)前項(xiàng)目的路徑,類庫(kù)中的Jar會(huì)被復(fù)制到其中
在接下來的窗口中輸入MyEclipse產(chǎn)生的Hibernate配置文件名及其路徑。使用hibernate.cfg.xml文件名,路徑保留默認(rèn)值,如圖28所示。
圖2 8設(shè)置生成hibernate.cfg.xml文件的名稱及其路徑
單擊Next按鈕,在DB Driver下拉列表框中選中已設(shè)置的oracledriver選項(xiàng),其他選項(xiàng)保留默認(rèn)值,如圖29所示。
圖2 9 選擇要使用的數(shù)據(jù)庫(kù)
單擊"Next"按鈕,清除"Create SessionFactory Class"復(fù)選框,如圖210所示,單擊Finish按鈕結(jié)束設(shè)置。
圖2 10 清除Create SessionFactoryClass復(fù)選框
執(zhí)行上述操作后,MyEclipse會(huì)在項(xiàng)目的構(gòu)建路徑中增加Hibernate的相關(guān)類庫(kù)和Oracle的驅(qū)動(dòng)類庫(kù)。同時(shí)生成了開發(fā)Hibernate應(yīng)用所需的hibernate.cfg.xml文件,整個(gè)項(xiàng)目的所有類庫(kù)文件和配置文件如圖211所示。
圖2 11 整個(gè)項(xiàng)目的所有類庫(kù)文件和配置文件
還需要修改MyEclipse自動(dòng)生成的hibernate.cfg.xml文件,增加一些新的配置項(xiàng)并修改Oracle數(shù)據(jù)庫(kù)方言類的名稱。修改后的hibernate.cfg.xml的內(nèi)容如下所示(加粗顯示部分為需要修改處)。
SRC 2 2 hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name=
"dialect">org.hibernate.dialect.Oracle9iDialect</property>
<property name=
"connection.url">jdbc:oracle:thin:@localhost:1521:ora9</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<property name=
"connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="myeclipse.connection.profile">oracledriver</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
</session-factory>
</hibernate-configuration>
2.7.3 自動(dòng)生成Guestbook類與映射文件
在Eclipse的DB Browser視圖中,右擊設(shè)置的oracledriver名。選擇Openconnection選項(xiàng),如圖2 12所示彈出Open Database Connection窗口,輸入用戶名及密碼,如圖213所示,單擊OK按鈕。
圖2 12 選澤Open DatabaseConnection選項(xiàng)
圖2 13 輸入用戶名與密碼
右擊DB Browser視圖中的guestbook表,選中"Hibernate ReverseEngineering"選項(xiàng)。如圖2 14所示。
圖2 14 選擇Hibernate ReverseEngineering選項(xiàng)
彈出"Hibernate Mapping and ApplicationGeneration"窗口,輸入與生成持久化類(POJO)有關(guān)的參數(shù)值。在Java srcfolder文本框中輸入生成持久化類的保存路徑,在Java package文本框中輸入持久化類所使用的包名。選擇"CreatePOJO<>DB Table mappinginformation、Create a Hibernate mapping file (*.hbm.xml) for eachdatabase table"及"Java Data Object(POJO<> DB Table)"復(fù)選框,清除"Createabstract class"復(fù)選框,如圖2 15所示。
圖2 15 設(shè)置生成POJO類與映射文件
單擊Next按鈕,在打開窗口中的Id Generator下拉列表框中選中sequence選項(xiàng),其他選項(xiàng)保留默認(rèn)值,如圖216所示。
圖2 16 選擇主鍵生成策略
單擊"Next"按鈕,在打開如圖2 17所示的窗口中單擊"Finish"按鈕。
圖2 17 設(shè)置逆向工程的細(xì)節(jié)
經(jīng)過上面的操作之后,MyEclipse會(huì)自動(dòng)生成Guestbook.java和Guestbook.hbm.xml兩個(gè)文件。Guestbook.hbm.xml文件的內(nèi)容如下所示,需要修改008行~第010行的內(nèi)容用來設(shè)置序列名。
SRC 2 3 Guestbook.hbm.xml
001 <?xmlversion="1.0" encoding="utf-8"?>
002 <!DOCTYPEhibernate-mapping PUBLIC "-//Hibernate/Hibernate
Mapping DTD 3.0//EN"
003 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
004<hibernate-mapping>
005 <classname="com.v512.examples.Guestbook" table="GUESTBOOK"
schema="SCOTT">
006 <id name="id" type="java.lang.Integer">
007 <column name="ID"precision="8" scale="0" />
008 <generatorclass="sequence">
009 <param name="sequence">gb_seq</param>
010</generator>
011</id>
012<propertyname="name" type="java.lang.String">
013 <column name="NAME"length="20" not-null="true" />
014</property>
015<propertyname="phone" type="java.lang.String">
016 <column name="PHONE"length="20" />
017</property>
018<propertyname="email" type="java.lang.String">
019 <column name="EMAIL"length="40" />
020</property>
021<propertyname="title" type="java.lang.String">
022 <column name="TITLE"length="80" not-null="true" />
023</property>
024<propertyname="content" type="java.lang.String">
025 <column name="CONTENT"length="2000" />
026</property>
027<propertyname="createdTime" type="java.util.Date">
028 <column name="CREATED_TIME"not-null="true" />
029</property>
030 </class>
031</hibernate-mapping>
第005行中<class>標(biāo)簽的schema屬性設(shè)置當(dāng)前表屬于哪個(gè)schema,第007行和第013行中<column>標(biāo)簽的precision、scale及l(fā)ength屬性設(shè)置表中字段的精度、小數(shù)點(diǎn)位數(shù)和長(zhǎng)度,not-null屬性設(shè)置該字段是否不允許為空。
2.7.4 編寫HibernateSessionFactoryUtil.java文件
在Hibernate應(yīng)用中,如果只使用一個(gè)數(shù)據(jù)庫(kù),則通常只需要一個(gè)SessionFactory對(duì)象。為了方便整個(gè)應(yīng)用取得同一個(gè)SessionFactory對(duì)象,我們應(yīng)用設(shè)計(jì)模式中的單態(tài)模式。編寫一個(gè)SessionFactory的工具類HibernateSessionFactoryUtil,HibernateSessionFactoryUtil.java文件的內(nèi)容如下:
SRC 2 4 HibernateSessionFactoryUtil.java
001 packagecom.v512.util;
002
003 importorg.hibernate.SessionFactory;
004 importorg.hibernate.cfg.Configuration;
005
006 publicclass HibernateSessionFactoryUtil{
007 privatestatic finalSessionFactory sessionFactory;
008 static{
009 try{
010 sessionFactory = newConfiguration().configure().
buildSessionFactory();
011 } catch(Throwable ex) {
012
016 thrownewExceptionInInitializerError(ex);
017 }
018 }
019
020 privateHibernateSessionFactoryUtil() {
021
022 }
023
024 publicstatic SessionFactory getSessionFactory(){
025 returnsessionFactory;
026 }
027 }
HibernateSessionFactoryUtil類在載入JVM后新建Configuration對(duì)象,讀取hibernate.cfg.xml文件,創(chuàng)建SessionFactory對(duì)象,通過HibernateSessionFactoryUtil類所提供的getSessionFactory()靜態(tài)方法獲取SessionFactory對(duì)象。
2.7.5 編寫HibernateTest.java
編寫一個(gè)測(cè)試的HibernateTest.java文件,通過Hibernate實(shí)現(xiàn)對(duì)guestbook表中數(shù)據(jù)的CRUD操作,在其中定義addGuestbook()、updateGuestbook()、getGuestbook()、getGuestbooks()、deleteGuestbook()和printGuestbook()方法。該文件的內(nèi)容如下:
SRC 2 5 HibernateTest.javaa
001 packagecom.v512.examples;
002
003 importjava.util.List;
004 importorg.hibernate.Query;
005 importorg.hibernate.Session;
006 importorg.hibernate.Transaction;
007 importcom.v512.util.HibernateSessionFactoryUtil;
008
009 publicclass HibernateTest {
010 publicvoid addGuestbook(Guestbook gb){
011Session session = HibernateSessionFactoryUtil.
getSessionFactory().
getCurrentSession();
012 Transaction tx =session.beginTransaction();
013 session.save(gb);
014 tx.commit();
015 }
016
017 publicGuestbook getGuestbook(Integer id) {
018 Session session =HibernateSessionFactoryUtil.
getSessionFactory().
getCurrentSession();
019 Transaction tx =session.beginTransaction();
020 Guestbook gb = (Guestbook)session.get
(Guestbook.class,id);
021 tx.commit();
022 returngb;
023 }
024
025 publicList<Guestbook> getGuestbooks(){
026 Session session =HibernateSessionFactoryUtil.
getSessionFactory().
getCurrentSession();
027 Transaction tx =session.beginTransaction();
028 Query query =session.createQuery("from Guestbook");
029List<Guestbook> list =query.list();
030 tx.commit();
031 returnlist;
032 }
033
034 publicvoid updateGuestbook(Guestbook gb){
035 Session session =HibernateSessionFactoryUtil.
getSessionFactory().
getCurrentSession();
036 Transaction tx =session.beginTransaction();
037 session.saveOrUpdate(gb);
038 tx.commit();
039 }
040
041 publicvoid deleteGuestbook(Integer id){
042 Guestbook gb =getGuestbook(id);
043 Session session =HibernateSessionFactoryUtil.
getSessionFactory().
getCurrentSession();
044 Transaction tx =session.beginTransaction();
045 session.delete(gb);
046 tx.commit();
047 }
048
049 publicvoid printGuestbook(Guestbook gb){
050 System.out.print("id:" + gb.getId() +"\t");
051 System.out.print("name:" + gb.getName()+ "\t");
052 System.out.print("title:" +gb.getTitle() + "\t");
053 System.out.print("content:" +gb.getContent() + "\t");
054 System.out.println("createdTime:" +gb.getCreatedTime());
055 }
056
057 publicstatic voidmain(String[] args) {
058 HibernateTest test =new HibernateTest();
059 Guestbook gb =test.getGuestbook(new Integer(1));
060
061 System.out.println("-------------------------
讀取單一記錄-----------------------------");
062 test.printGuestbook(gb);
063
064 System.out.println("-------------------------
讀取所有記錄-----------------------------");
065List<Guestbook> list =test.getGuestbooks();
066 for(Guestbook g : list) {
067 test.printGuestbook(g);
068 }
069
070 System.out.println("-------------------------
更新記錄---------------------------------");
071 gb.setName("關(guān)羽");
072 test.updateGuestbook(gb);
073 test.printGuestbook(gb);
074
075 System.out.println("-------------------------
刪除記錄---------------------------------");
076test.deleteGuestbook(new Integer(1));
077
078HibernateSessionFactoryUtil.getSessionFactory().close();
079 }
080 }
當(dāng)使用HibernateTest類中g(shù)etGuestbook()方法根據(jù)id值獲取一條記錄時(shí),Hibernate找到數(shù)據(jù)庫(kù)中這條記錄,然后再生成這條記錄所對(duì)應(yīng)的持久化對(duì)象返回。updateGuestbook()方法更新一條記錄時(shí)首先找到這條記錄所對(duì)應(yīng)的持久化對(duì)象,然后調(diào)用這個(gè)對(duì)象的setter方法修改屬性值,并通過Hibernate完成數(shù)據(jù)庫(kù)中數(shù)據(jù)的更新;deleteGuestbook()方法刪除一條記錄時(shí)首先找到這條記錄所對(duì)應(yīng)的持久化對(duì)象,然后通過Hibernate刪除持久化對(duì)象刪除進(jìn)而數(shù)據(jù)庫(kù)中所對(duì)應(yīng)的數(shù)據(jù)。
2.7.6 程序運(yùn)行結(jié)果
這個(gè)實(shí)例使用Hibernate完成對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的CRUD操作,借助MyEclipse的幫助開發(fā)Hibernate應(yīng)用,不需要手工編寫持久化(POJO)類、Hibernate的配置和映射文件。Hibernate通過操作持久化對(duì)象完成對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的CRUD操作,HibernateTest.java運(yùn)行結(jié)果如下:
-------------------------讀取單一記錄-----------------------------
id:1 name:劉偉 title:大家好
content:歡迎大家學(xué)習(xí)Hibernate技術(shù)。
createdTime: 2009-03-12 06:17:59.0
-------------------------讀取所有記錄-----------------------------
id:1 name:劉偉 title:大家好
content:歡迎大家學(xué)習(xí)Hibernate技術(shù)。
createdTime: 2009-03-12 06:17:59.0
-------------------------更新記錄---------------------------------
id:1 name:關(guān)羽 title:大家好
content:歡迎大家學(xué)習(xí)Hibernate技術(shù)。
createdTime: 2009-03-12 06:17:59.0
-------------------------刪除記錄---------------------------------
2.7.7 使用 HQL 編輯器調(diào)試HQL語句
MyEclipse中包含一個(gè)Hibernate編輯器和多個(gè)相關(guān)視圖,允許根據(jù)當(dāng)前項(xiàng)目的配置來調(diào)試HQL語句。"HibernateDynamic Query Translator"視圖顯示當(dāng)前HQL語句所對(duì)應(yīng)的SQL語句;"Hibernate QueryResult"視圖查看HQL語句的執(zhí)行結(jié)果,返回的持久化對(duì)象的屬性值通過"Properties"視圖顯示;"QueryParameters"視圖可以為調(diào)試的HQL語句輸入需要的參數(shù)值。
右擊Package Explorer視圖中的chapter02_first項(xiàng)目,選中快捷菜單中的"MyEclipse→OpenHQL Editor"選項(xiàng),如圖2 18所示。
圖2-18 MyEclipse→Open HQLEditor選項(xiàng)
打開HQL編輯器,輸入"from Guestbook"。單擊運(yùn)行圖標(biāo)執(zhí)行查詢,并且通過相關(guān)視圖查看查詢結(jié)果,如圖219所示。
圖2 19在HQL編輯器中執(zhí)行HQL查詢并查看結(jié)果
還可以使用"Query Parameters視圖輸入需要綁定參數(shù)的HQL查詢語句,如圖2 20所示。
圖2 20 使用Query Parameters視圖輸入需要綁定參數(shù)的HQL查詢語句
2.8 Hibernate應(yīng)用的開發(fā)方式
2.8.1 自底向上,從數(shù)據(jù)庫(kù)表到持久化類
采用自底向上的開發(fā)方式,采用手工或者M(jìn)yEclipse等開發(fā)工具直接根據(jù)數(shù)據(jù)庫(kù)中表的結(jié)構(gòu)生成對(duì)應(yīng)的映射文件和持久化類。這是實(shí)際開發(fā)中最常用的一種方式,也是本書所推薦的方式。通過這種方式最小化了手工編碼,降低了出錯(cuò)的可能性。
2.8.2 自上向下,持久化類到數(shù)據(jù)庫(kù)表
首先編寫持久化類,然后根據(jù)持久化類的代碼手工編寫或者采用工具生成映射文件,進(jìn)而生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)。這種方式在實(shí)際開發(fā)中也經(jīng)常使用,可能出現(xiàn)的問題是生成的數(shù)據(jù)庫(kù)表結(jié)構(gòu)與實(shí)際需要的數(shù)據(jù)庫(kù)表結(jié)構(gòu)之間的差異,需要手工調(diào)整。
2.8.3 從中間出發(fā),向上與向下發(fā)展
首先編寫持久化類與數(shù)據(jù)庫(kù)表的映射文件,然后根據(jù)映射文件手工編碼或者采用工具向上生成持久化類,向下生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)。
2.9 設(shè)置Hibernate使用連接池
Hibernate默認(rèn)使用一個(gè)功能簡(jiǎn)單的連接池,通常只用于開發(fā)階段測(cè)試之用。為了更高效地使用Hibernate,可以設(shè)置Hibernate使用第三方C3P0或者應(yīng)用服務(wù)器(容器)所帶的數(shù)據(jù)庫(kù)連接池。
2.9.1 設(shè)置使用Tomcat中的連接池
如果開發(fā)運(yùn)行在應(yīng)用服務(wù)器中的程序,建議其中配置的連接池,如允許Hibernate使用通過在Tomcat中所配置的連接池。為此修改Tomcat中的context.xml文件,該文件位于tomcat安裝目錄的conf子目錄中,同時(shí)還需要將Oracle數(shù)據(jù)庫(kù)的驅(qū)動(dòng)類庫(kù)ojdbc6.jar或者ojdbc14.jar添加到tomcat的lib目錄下。修改后的context.xml文件內(nèi)容如下:
SRC 2 6 context.xml
<Context reloadable="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/oracleds" auth="Container"
type="javax.sql.DataSource"maxActive="100"
maxIdle="30"maxWait="10000" username="scott" password="tiger"
driverClassName="oracle.jdbc.OracleDriver" url=
"jdbc:oracle:thin:@localhost:1521:ora9"/>
</Context>
設(shè)置Tomcat提供的連接池之后,要在Hibernate的配置文件(hibernate.cfg.xml)中添加connection.datasource屬性,如下面的代碼所示:
<property name="connection.datasource">
java:comp/env/jdbc/oracleds</property>
其中的java:comp/env/jdbc/oracleds是Tomcat中設(shè)置的數(shù)據(jù)源對(duì)象的JNDI名稱。
2.9.2 使用C3P0連接池
如果讓Hibernate使用第三方C3P0連接池,則在Hibernate的配置文件中添加如下的配置信息,還需要把C3P0類庫(kù)添加到當(dāng)前項(xiàng)目的構(gòu)建路徑下。
<property name="connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.timeout">3600</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
- hibernate.c3p0.min_size:設(shè)置連接池的最小連接數(shù)。
- hibernate.c3p0.max_siz:設(shè)置連接池的最大連接數(shù)。
- hibernate.c3p0.timeout:設(shè)置連接池中的連接的最大空閑時(shí)間,超時(shí)后會(huì)被刪除,單位為秒。
- hibernate.c3p0.max_statements:設(shè)置連接池中Statement對(duì)象的最大數(shù)量。
- hibernate.c3p0.idle_test_period:設(shè)置檢查連接池中空閑連接的間隔時(shí)間,單位為秒。
- hibernate.c3p0.acquire_increment:設(shè)置連接池的連接用完后每次新建連接的數(shù)量。
2.9.3 使用自定義連接池
在Hibernate應(yīng)用中還可以使用定義連接池,該連接池需要實(shí)現(xiàn)org.hibernate.connection.ConnectionProvider接口,并在Hibernate配置文件中設(shè)置hibernate.connection.provider_class屬性,其值為這個(gè)實(shí)現(xiàn)類的名稱。
2.10 使用C3P0連接池
2.10節(jié)的例子源代碼在配套光盤sourcecode/workspace目錄的chapter02_first項(xiàng)目中。
2.10.1 創(chuàng)建chapter02_c3p0項(xiàng)目
在這個(gè)實(shí)例中讓Hibernate使用第三方C3P0連接池獲取操作數(shù)據(jù)庫(kù)的連接對(duì)象,通過復(fù)制chapter02_first項(xiàng)目創(chuàng)建chapter02_c3p0項(xiàng)目。同時(shí)還需要把C3P0連接池的類庫(kù)(c3p0-*.*.*.jar)添加到當(dāng)前項(xiàng)目的構(gòu)建目錄下。當(dāng)前項(xiàng)目構(gòu)建路徑中的類庫(kù)如圖221所示。
圖2 21chapter02_c3p0項(xiàng)目構(gòu)建路徑中的類庫(kù)
2.10.2 編輯hibernate.cfg.xml文件
當(dāng)前項(xiàng)目使用了C3P0的連接池技術(shù),修改hibernate.cfg.xml文件以配置相應(yīng)的參數(shù),其內(nèi)容如下:
SRC 2 7 hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD3.0//EN"
"http://hibernate.sourceforge.net
/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">oracle.jdbc.driver.
OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:
1521:ora9</property>
<property name="dialect">org.hibernate.dialect.
Oracle9iDialect</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<!-- C3P0 連接池的配置 -->
<property name="connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.timeout">3600</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping resource="com/v512/examples/Guestbook.hbm.xml"/>
</session-factory>
</hibernate-configuration>