2010年8月15日 星期日

Hibernate 教學

今年暑假在學 Hibernate

ㄧ個 J2EE 持久層下的 framework

運用 Hibernate 可以大幅減少 JDBC 的程式複雜度

這也確實拉,起碼我寫到現在能稍微體會了 

以上是從簡化 JDBC 的角度來看 Hibernate,接下來說點更抽象的東西

在一個系統中,商業邏輯層(Business Layer) 中最核心的物件和資料庫中的 table 可並不全然是一對一的對應,而 Hibernate 可以消彌這兩者之間的不對稱

這部份還有很多東西要說,改天再一一介紹,先來說說第一個 Hibernate 的程式


首先要讓你的系統能開發 Hibernate 必須先到官方網站下載


下載完並解壓縮後,可以到 lib 資料夾下找必須的 jar 檔

其中必須的檔案為 hibernate3、antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging、 EHCache

並將這些 jar 放在你的 WEB 應用程式中的 WEB-INF/lib 之下。

而一般我選擇的開發平台是 Netbeans 6.8

一開始建立 WEB application 的時候可以選擇你要導入的 framework

Netbeans 會自動幫你加入那些 jar,在我目前的 Netbeans 是使用 Hibernate 3.2.5

勾選 Hibernate 3.2.5 之後,會要求你選擇 Database Connection 和 Database Dialect

你可以再這邊建立一個新的連接,也可以使用舊有的連接

建立完專案之後即可以開始第一步

首先必須先配置 Hibernate 的配置文件,該檔名為 hibernate.cfg.xml

並且位於你目前 WEB application 的 classpath 下

在Netbeans 中你可以在 Source Packages 的 default package 下找到

程式如下:





org.hibernate.dialect.MySQLDialect

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/hibernate

root

123456789

true







接下來第二步就先建立一個 user 資料表,如下:
CREATE TABLE user {
id bigint not null auto_increment,
name varchar(20),
primary key (id)
}

建立完 table 之後,對於這個 table 我們會有一個對應的 User 類別


package MapPOJO;

public class User implements java.io.Serializable
{
private Long id;  //Long 的資料型態會對應到資料表的 bigint
private String name;

public User() {  /*預設建構子, 要讓Hibernate 建立物件用, 不寫沒關係 */
}

public User(Long id, String name) {  //覆載建構子
this.id = id;
this.name = name;
}

public Long getId() {
return this.id;
}

public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}
}



以上就是對應到 user table 的 User 類別,類別的撰寫大致上跟 Javabean 一樣

注意一點的就是可能會有人問都把 id 和 name 設定成 private

那 Hibernate 要怎能夠取到它的值 ((放心 它就是有辦法!!

至於上述程式中,有一個有參數的覆載的建構子,這也只是供程式設計師使用

有必要再加即可。

完成類別和資料表的建立後,我們必須建立一個 XML

讓類別和資料表建立關係,此檔即為 映射文件檔

該檔主要就是告訴 Hibernate 要如何把 User 的實例映射到對應的 table

檔名即為 User.hbm.xml,程式如下:


















以上的映射文檔,盡量是和 User 類別放同一資料夾,在 Netbeans 中

可以直接建立一個叫 Hibernate Mapping Wizard 的檔案

這個就是你的映射文件檔的,建立完成後他會幫你在 Hibernate 的配置檔中

自動建立一個 類別組態檔 就是一開始看到的

<mapping resource="test/User.hbm.xml" />

接下來直接再看一段程式碼,可以直接透過 Netbeans 直接建立一個

名為 HibernateUtil.java 的類別檔,建立完成後就可以不暫時不動它了

程式如下:



package MapPOJO;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
public class HibernateUtil
{
private static final SessionFactory sessionFactory;

//下面這個 static 區塊會讀取 hibernate.cfg.xml ,
//並且產生一個SessionFactory的實體, 通常只要  產生一個即可,
//而SessionFactory 在壹班操作中最重要的就是拿來建立 Session物件

static {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml)
// config file.
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}



最後我們作一張 JSP 來進行測試,

一開始可以 import user 類別的所在 package,和 org.hibernate.*

<%@page import="MapPOJO.*" %>

<%@page import="org.hibernate.*" %>

接下來可以在 scriptlets 區塊中寫些 Java 程式,如下:

<%
User user = new User(); //建立 User 實例
user.setName("Allen");
org.hibernate.Session sess = null;
/*透過SessionFactory 取得 Session 實例*/
org.hibernate.SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
/*取得資料庫連線*/
sess = sessionFactory.openSession();
/*開啟一個會話操作*/
org.hibernate.Transaction tx = sess.beginTransaction();
/*將 user 物件映射到資料庫中對應的表格儲存*/
sess.save(user);
tx.commit();
sess.close();
%>

上述程式執行完成後,可以到資料表中觀察結果

這邊需注意一點的是在資料表設計時記得主鍵要 auto_increment

因為在 User.hbm.xml 中的主鍵生成方式設定為 native

即是使用 MySQL 資料庫原生 auto_increment 的主鍵生成機制

如果沒有設定的話會發生執行期的例外

例外的詳細內容待後述


之後再說明更多有Hibernate 和 "物件" 的一些思維 !!!

並在介紹更多 Hibernate O/R Mapping


3 則留言:

  1. 請問版大高手: hibernate 是自己買書學的嗎?? 我找不到完整的hibernate 的書; 該怎麼學hibnerate ?

    回覆刪除
  2. 請問版大高手: hibernate 是自己買書學的嗎?? 我找不到完整的hibernate 的書; 該怎麼學hibnerate ?

    回覆刪除
    回覆
    1. Hibernate 應該有很多書才對,不過建議看原文的比較好

      刪除