论坛首页 Java企业应用论坛

hibernate 学习非常好的中文文档 (初学者,入门者)

浏览 9645 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-02-12  
与大家分享一篇不错的文章


详细内容察看
http://www.iebloger.com/forum/viewthread?thread=21

实在太多了 就贴了一点


一。入门
1。簡介Hibernate
傳統的資料庫程式設計,必須直接在程式中硬編碼(hard code)SQL陳述,JDBC統一了Java程式與資料庫之間的操作介面,讓程式設計人員可以不用關係與資料庫特定相關的API操作,然而撰寫SQL陳述或自行封裝SQL仍是不可避免或必要的目標,而在物件導向程式設計中,物件與物件之間的關係,在匹配到關聯式資料庫中表格與表格之間的關係,並無法進行簡單的轉換以進行匹配。

Hibernate是「物件/關係對應」(Object/relational mapping)的解決方案,簡寫為ORM,所謂的ORM,簡單的說就是將Java中的物件與物件關係,對應到關聯式資料庫中的表格與表格之間的關係,Hibernate提供了這個過程中自動化對應轉換的方案,相反的,也提供關聯式資料庫中表格與表格之間的關係,對應至Java程式中,物件與物件的關係。

Hibernate在Java程式與資料庫之間進行轉換,Java程式設計人員只要事先定義好物件與資料庫表格之間的對應,之後Java程式設計人員可以用所熟悉的物件導向程式方法撰寫程式,而不用特定轉換SQL,所有SQL的轉換交由Hibernate進行處理。

Hibernate的官方網站在:
http://www.hibernate.org/

有關Hibernate介紹的簡體中文網站在:
http://www.hibernate.org.cn/

想要學習Hibernate,可以從官方網站的Hibernate参考手册開始,在上面的簡體中文網站中,有Hibernate參考手冊的簡體中文翻譯,這可以當作設定Hibernate相關功能時的參考手冊,書籍方面,可以看Manning的Hibernate in Action與Oreilly的Hibernate: A Developer's Notebook,Hibernate in Action當中介紹了很多關於持久層設計的觀念與理論,而A Developer's Notebook當中提供了較多實作的範例參考,另外,也可以在網路上找夏昕的Hibernate開發指南,可以讓您在短時間內瞭解Hibernate的概貌。

在我所撰寫的介紹中,主要是學習過程中,將一些配置及較關鍵性的觀念作一個記錄,但必要強調的是,有關於Hibernate的學習,並不完全在於如何設定與使用Hibernate,而是在於學習當中持久層設計的概念,這些概念如果能在學習Hibernate的過程中體會並吸收,日後即使不使用Hibernate撰寫程式,也可以發揮Hibernate持久層設計的概念於其他程式之中。

資料庫的設計是我正在學習的,有關於Hibernate持久層設計的概念,我個人的知識與學習並不足於讓我在這邊造次,這邊所建議的是看看Hibernate in Action,初看您會覺得當中儘是文字性描述,缺少範例說明,但多看個幾次,慢慢的您會發現,當中有相當多的觀念您只要瞭解,自然就知道如何使用了,設定方面通常您只要看看參考手冊按當中的說明進行就可以了。

2。Hibernate所需類別庫

Hibernate是ORM的解決方案,其底層對資料庫的操作依賴於JDBC,所以您必須先取得JDBC驅動程式,在這邊我們使用的是MySQL,所以您必須至以下網址先取得MySQL的JDBC驅動程式:
http://www.mysql.com/products/connector/j/

接下來取得Hibernate,在撰寫此文的同時,Hibernate最後的穩定版本是2.1.6,而3.0版還在測試階段,這邊的介紹將以2.1.6為主,所以請至以下網址取得hibernate-2.1.6.zip:
http://www.hibernate.org/

解開hibernate-2.1.6.zip後,當中的hibernate2.jar是必要的,而在lib目錄中還包括了許多jar檔案,其中dom4j、CGLIB、Commons Collections、Commons Logging、ODMG4、EHCache是必要的,而Log4j則是建議使用的,為何使用這些jar,在Hibernate參考手冊中有說明,您可以開啟doc\reference中的參考手冊,有英文版與簡體中文版的介紹,檔案格式則提供有html與pdf兩種,以下列出簡體中文中的說明:

dom4j(必需):Hibernate在解析XML配置和XML映射元文件時需要使用dom4j。

CGLIB(必需):Hibernate在運行時使用這個代碼生成庫強化類(與Java反射機制聯合使用)。

Commons Collections, Commons Logging(必需):Hibernat使用Apache Jakarta Commons項目提供的多個工具類庫。

ODMG4(必需):Hibernate提供了一個可選的ODMG兼容持久化管理界面。如果你需要映射集合,你就需要這個類庫,就算你不是為了使用ODMG API。

EHCache(必需):Hibernate可以使用不同的第二級Cache方案。如果沒有修改配置的話,EHCache提供默認的Cache。

Log4j(可選):Hibernate使用Commons Logging API,後者可以使用Log4j作為底層實施log的機制。如果上下文類目錄中存在Log4j庫,Commons Logging就會使用Log4j和它在上下文類路徑中找到的log4j.properties文件。在Hibernate發行包中包含有一個示例的properties文件。所以,如果你想看看幕後到底發生了什麼,也把log4j.jar拷貝到你的上下文類路徑去吧(它位於src/目錄中)。

以上是Hibernate參考手冊所列出的jar檔案,Hibernate底層還需要Java Transaction API,所以您還需要jta.jar,到這邊為止,總共需要十個jar檔案:
代碼:
mysql-connector-java-3.0.14-production-bin.jar
jta.jar
hibernate2.jar
cglib-full-2.0.2.jar
commons-collections-2.1.1.jar
commons-logging-1.0.4.jar
dom4j-1.4.jar
ehcache-0.9.jar
log4j-1.2.8.jar
odmg-3.0.jar


其它的jar檔案則視您的需要來設定,例如您應該也會使用到Ant,這對於自動化建構Hibernate有相當的幫助,您可以先查看我另一個版面上有關於Ant的介紹:
http://www.caterpillar.onlyfun.net/phpBB2/viewtopic.php?t=1354

Hibernate可以運行於單機之上,也可以運\行於Web應用程式之中,如果是運行於單機,則將所有用到的jar檔案(包括JDBC驅動程式)設定至CLASSPATH中,如果是運行於Web應用程式中,則將jar檔案置放於WEB-INF/lib中,其中JDBC驅動程式也可以依賴於JNDI來取得資源,設定的方式之後介紹,或者您也可以先看看這篇文章有關於DBCP的介紹:
http://www.caterpillar.onlyfun.net/phpBB2/viewforum.php?f=29

準備好這些檔案後,我們下一個主題將介紹一個快速入門的例子。

3。第一個Hibernate程式

這邊以一個簡單的單機程式來示範Hibernate的配置與功能,在這個例子中的一些操作,實際上會使用一些自動化工具來完成,而不一定親自手動操作設定,這邊完全手動的原因,在於讓您可以知道Hibernate實際上會作那些動作,在進行範例之前,請先確定前一個主題中的相關jar檔案都已經設定在CLASSPATH中。

我們先作資料庫的準備工作,在MySQL中新增一個HibernateTest資料庫,並建立USER表格:
代碼:
CREATE TABLE USER (
user_id CHAR(32) NOT NULL PRIMARY KEY,
name VARCHAR(16) NOT NULL,
sex CHAR(1),
age INT
);

我們先撰寫一個純Java物件,它純綷表示一個資料集合,待會我們會將之映射至資料庫的表格上,程式如下:
代碼:
package onlyfun.caterpillar;

public class User {
private String id;
private String name;
private char sex;
private int age;

public int getAge() {
return age;
}

public String getId() {
return id;
}

public String getName() {
return name;
}

public char getSex() {
return sex;
}

public void setAge(int i) {
age = i;
}

public void setId(String string) {
id = string;
}

public void setName(String string) {
name = string;
}

public void setSex(char c) {
sex = c;
}
}


其中id是個特殊的屬性,Hibernate會使用它來作為主鍵識別,我們可以定義主鍵產生的方式,這是在XML映射文件中完成,為了告訴Hibernate物件如何映射至資料庫表格,我們撰寫一個XML映射文件檔名是User.hbm.xml,如下所示:
代碼:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>

<class name="onlyfun.caterpillar.User" table="USER">

<id name="id" type="string" unsaved-value="null">
<column name="user_id" sql-type="char(32)" />
<generator class="uuid.hex"/>
</id>

<property name="name" type="string" not-null="true">
<column name="name" length="16" not-null="true"/>
</property>

<property name="sex" type="char"/>

<property name="age" type="int"/>

</class>

</hibernate-mapping>

這個XML文件定義了物件屬性映射至資料庫表格的關係,您可以很簡單的瞭解對映的方法,像是User物件對應至USER表格,其中我們使用uuid.hex來定義主鍵的產生算法,UUID算法使用IP地址、JVM的啟動時間、系統時間和一個計數值來產生主鍵。除了使用uuid.hex之外,我們還可以使用其它的方式來產生主鍵,像是increment等,這可以在Hibernate參考手冊中找到相關資料。

<property>標籤用於定義Java物件的屬性,而當中的<column/>標籤用於定義與資料庫的對應,如果您是手工建立Java物件與資料庫表格,則在最簡單的情況下,可以只定義<property name="sex"/>這樣的方式,而由Hibernate自動判斷Java物件屬性與資料庫表格名稱對應關係,在<property/>與<column/>標籤上的額外設定(像是not null、sql-type等),則可以用於自動產生Java物件與資料庫表格的工具上。

接下來我們定義Hibernate配置文件,主要是進行SessionFactory配置,Hibernate可以使用XML或屬性文件來進行配置,我們這邊先介紹如何使用XML配置,這也是Hibernate所建議的配置方式,我們的檔名是hibernate.cfg.xml,如下:
代碼:
<?xml version='1.0' encoding='big5'?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>

<session-factory>

<!-- 顯示實際操作資料庫時的SQL -->
<property name="show_sql">true</property>
<!-- SQL方言,這邊設定的是MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- JDBC驅動程式 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- JDBC URL -->
<property name="connection.url">jdbc:mysql://localhost/HibernateTest</property>
<!-- 資料庫使用者 -->
<property name="connection.username">caterpillar</property>
<!-- 資料庫密碼 -->
<property name="connection.password">123456</property>

<!-- 物件與資料庫表格映射文件 -->
<mapping resource="User.hbm.xml"/>

</session-factory>

</hibernate-configuration>


接下來我們撰寫一個測試的程式,這個程式將直接以Java程式設計人員熟悉的語法方式來操作物件,而實際上也直接完成對資料庫的操作,程式將會將一筆資料存入表格之中:
代碼:
import onlyfun.caterpillar.*;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;

public class HibernateTest {
public static void main(String[] args) throws HibernateException {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

User user = new User();
user.setName("caterpillar");
user.setSex('M');
user.setAge(28);

Session session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
session.save(user);
tx.commit();
session.close();
sessionFactory.close();

System.out.println("新增資料OK!請先用MySQL觀看結果!");
}
}


Configuration代表了Java物件至資料庫的映射設定,這個設定是從我們上面的XML而來,接下來我們從Configuration取得SessionFactory物件,並由它來開啟一個Session,它代表物件與表格的一次會話操作,而Transaction則表示一組會話操作,我們只需要直接操作User物件,並進行Session與Transaction的相關操作,Hibernate就會自動完成對資料庫的操作。這邊對程式先只作簡單的介紹,之後再詳加說明。

將所有的.java檔案編譯,並將兩個XML檔案放置在與HibernateTest相同的目錄中,也就是檔案位置如下:
代碼:
/
|--HibernateTest.class
|--User.hbm.xml
|--hibernate.cfg.xml
/onlyfun
/caterpillar
|--User.class


OK!現在您可以執行HibernateTest,程式將會出現以下的訊息:
代碼:
log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into USER (name, sex, age, user_id) values (?, ?, ?, ?)
新增資料OK!請先用MySQL觀看結果!


這邊只先進行資料的存入,要觀看資料存入的結果的話,請進入MySQL觀看,以下是資料庫存入的結果:
代碼:
mysql> SELECT * FROM USER;
+----------------------------------+-------------+------+------+
| user_id | name | sex | age |
+----------------------------------+-------------+------+------+
| 297e3dbdfea6023d00fea60241000001 | caterpillar | M | 28 |
+----------------------------------+-------------+------+------+
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics