ㄧ個 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 類別
建立完 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
請問版大高手: hibernate 是自己買書學的嗎?? 我找不到完整的hibernate 的書; 該怎麼學hibnerate ?
回覆刪除請問版大高手: hibernate 是自己買書學的嗎?? 我找不到完整的hibernate 的書; 該怎麼學hibnerate ?
回覆刪除Hibernate 應該有很多書才對,不過建議看原文的比較好
刪除