?? 用hibernate和spring開發事務持久層.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0053)http://www.javafan.net/article/20041223180912482.html -->
<HTML><HEAD><TITLE>用Hibernate和Spring開發事務持久層</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content=免費Java教程下載,Java電子書籍,Java技術文章,Hibernate,Spring,事務持久層
name=keywords><LINK href="用Hibernate和Spring開發事務持久層.files/style.css"
rel=stylesheet>
<STYLE>TD {
FONT-SIZE: 13px; COLOR: #646464; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
</STYLE>
<SCRIPT>
function fontZoom(size)
{
document.getElementById('fontzoom').style.fontSize=size+'px'
}
</SCRIPT>
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
<BODY>
<TABLE cellSpacing=0 cellPadding=0 width=751 align=center border=0>
<TBODY>
<TR>
<TD><IMG height=75 src="用Hibernate和Spring開發事務持久層.files/u_11.gif"
width=751></TD></TR>
<TR>
<TD vAlign=top background=用Hibernate和Spring開發事務持久層.files/u_bg.gif><BR>
<DIV align=right>頁面功能 【<A
href="javascript:window.external.AddFavorite(location.href,document.title+'--www.JavaFan.NET');">加入收藏</A>】
【<A
onclick="window.open(this.href,'','top=180,left=240,width=342,height=326,scrollbars=yes,resizable=no');return false;"
href="http://www.javafan.net/sendarticle.jsp?title=用Hibernate和Spring開發事務持久層&URL=20041223180912482">推薦給朋友</A>】
【字體:<A class=black href="javascript:fontZoom(15)">大</A> <A
class=black href="javascript:fontZoom(13)">中</A> <A class=black
href="javascript:fontZoom(12)">小</A>】 【<A class=black
href="javascript:window.close()">關閉</A>】 </DIV>
<TABLE cellSpacing=0 cellPadding=0 width=740 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top align=right>
<TABLE cellSpacing=0 cellPadding=0 width=730 border=0>
<TBODY>
<TR>
<TD><IMG height=11
src="用Hibernate和Spring開發事務持久層.files/u_14.gif" width=10></TD>
<TD style="BORDER-TOP: #e8e8e8 1px solid" bgColor=#f9f9f9><IMG
height=1 src="" width=1></TD>
<TD><IMG height=11
src="用Hibernate和Spring開發事務持久層.files/u_15.gif" width=10></TD>
<TD vAlign=top width=8 rowSpan=3><BR><IMG height=136
src="用Hibernate和Spring開發事務持久層.files/u_13.gif" width=8></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: #e8e8e8 1px solid; BORDER-LEFT: #e8e8e8 1px solid"
align=middle bgColor=#f9f9f9 colSpan=3>
<TABLE style="WORD-BREAK: break-all" cellSpacing=0
cellPadding=0 width=700 align=center border=0>
<TBODY>
<TR>
<TD align=middle height=25><FONT face=黑體 size=4>用
Hibernate 和 Spring 開發事務持久層</FONT></TD></TR>
<TR bgColor=#f9f9f9>
<TD id=fontzoom style="LINE-HEIGHT: 200%">
<P align=center>作者:Richard
來自:IBM</P>
<P> 當您自以為已經了解了所有開發工具時,肯定又會冒出一個新的工具。在本文中,developerWorks
的固定撰稿人 Rick Hightower 用一個真實世界的例子向您介紹兩個最激動人心的企業新技術。<A
href="http://www.javafan.net/special/hibernate/index.jsp"
target=_blank>Hibernate</A> 是一個對象關系映射工具,而 <A
href="http://www.javafan.net/special/spring/index.jsp"
target=_blank>Spring</A> 是一個 AOP 框架和 IOC 容器。Rick
介紹了如何結合這兩者,為企業應用程序構建一個事務持久層。</P>
<P> 如果關心開發人員的最新熱點,那么您可能聽說過 IOC (控制倒置,Inversion of
Control)容器和 AOP
(面向方面編程)。不過,像許多開發人員一樣,您可能不清楚在自己的開發工作中如何使用這些技術。在本文中,通過具體介紹使用
Hibernate 和 Spring 在企業應用程序中構建一個事務持久層,您會認識到這些技術。</P>
<P> Hibernate 是 Java
平臺上的一種流行的、容易使用的開放源代碼對象關系(OR)映射框架。Spring 是一個 AOP 框架和 IOC
容器。這兩種技術一起提供了本文中介紹的開發工作的基礎。將使用 Hibernate
把一些持久性對象映射到關系數據庫中,用 Spring 使 Hibernate
更容易使用并提供聲明性事務支持。由于為示例類編寫測試代碼時使用了 DbUnit,我還附帶介紹了一點 TDD
(測試驅動的開發)的內容。</P>
<P> 注意,本文假定讀者熟悉 Java 平臺上的企業開發,包括 JDBC、OR 映射內容、J2EE
設計模式如 DAO,以及聲明性事務支持,如 Enterprise JavaBean
(EJB)技術所提供的事務支持。理解這里的討論不需要成為這些技術的專家,也不需要熟悉 AOP、IOC 或者
TDD,因為在本文中對這三者都做了介紹。</P>
<P> 我將首先介紹兩種開發技術,然后分析例子。</P>
<P> <STRONG>Hibernate 簡介</STRONG> </P>
<P> Hibernate 是 Java 平臺上的一種全功能的、開放源代碼 OR 映射框架。Hibernate
在許多方面類似于 EJB CMP CMR (容器管理的持久性/容器管理的關系)和 JDO(Java Data
Objects)。與 JDO 不同,Hibernate 完全著眼于關系數據庫的 OR
映射,并且包括比大多數商業產品更多的功能。大多數 EJB CMP CMR 解決方案使用代碼生成實現持久性代碼,而
JDO 使用字節碼修飾。與之相反,Hibernate
使用反射和運行時字節碼生成,使它對于最終用戶幾乎是透明的(以前 Hibernate
的實現只使用反射,它有助于調試,當前版本保留了這種選項)。</P>
<P> 移植基于 Hibernate 的應用程序</P>
<P> 如果應用程序必須在多個 RDBMS 系統上運行 ,那么基于 Hibernate
的應用程序可以毫不費力地移植到 IBM
DB2、MySQL、PostgreSQL、Sybase、Oracle、HypersonicSQL
和許多其他數據庫。我最近甚至將一個應用程序從 MySQL 移植到 Hibernate 沒有很好支持的
Firebird,而這種移植是很容易的。<BR>Hibernate
可以模擬繼承(有幾種方式)、關聯(一對一或者一對多、containment 和 aggregation)和
composition。我將在本文中討論每種關系類型的幾個例子。</P>
<P> Hibernate 提供了一種稱為 Hibernate Query Language (HQL) 的
查詢語言,它類似于 JDO 的 JDOQL 和 EJB 的 EJB QL,盡管它更接近于前者。但是
Hibernate 沒有就此止步:它還可以進行直接的 SQL 查詢和/或使用 object criteria
很容易地在運行時構成查詢條件。在本文的例子中我將只使用 HQL。</P>
<P> 與 EJB CMP CMR 不同,Hibernate 像 JDO 一樣可以在 J2EE
容器內部或者外部工作,這可以讓那些進行 TDD 和敏捷開發的人受益。</P>
<P> <STRONG>Spring 簡介</STRONG></P>
<P> AOP 專家 Nicholas Lesiecki 第一次向我解釋 AOP
時,他說的我一個詞也沒理解,我覺得就像第一次考慮使用 IOC
容器的可能性時一樣。每一種技術的概念基礎本身就需要很好地消化,每一種技術所使用的各種各樣的縮寫讓事情更糟了——特別是其中許多術語與我們已經使用的根本不一樣了。
</P>
<P> 像許多技術一樣,理解這兩種技術的實際使用比學習理論更容易。經過自己對 AOP 和 IOC 容器實現(即
XWork、PicoContainer 和
Spring)的分析,我發現這些技術可以幫助我獲得功能,而不會在多框架中添加基于代碼的依賴性。它們都將成為我后面開發項目的一部分。</P>
<P> 簡單地說,AOP
讓開發人員可以創建非行為性的關注點,稱為橫切關注點,并將它們插入到應用程序代碼中。使用 AOP
后,公共服務(比如日志、持久性、事務等)就可以分解成方面并應用到域對象上,同時不會增加域對象的對象模型的復雜性。</P>
<P> IOC 允許創建一個可以構造對象的應用環境,然后向這些對象傳遞它們的協作對象。正如單詞 倒置
所表明的,IOC 就像反過來的
JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight
construction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。</P>
<P> Spring 既是一個 AOP 框架、也是一個 IOC 容器。我記得 Grady Booch
說過,對象最好的地方是可以替換它們,而 Spring 最好的地方是它有助于您替換它們。有了 Spring,只要用
JavaBean
屬性和配置文件加入依賴性(協作對象)。然后可以很容易地在需要時替換具有類似接口的協作對象。</P>
<P> Spring 為 IOC 容器和 AOP 提供了很好的入口(on-ramp)。因此,不需要熟悉 AOP
就可以理解本文中的例子。所需要知道的就是將要用 AOP 為示例應用程序聲明式地添加事務支持,與使用 EJB
技術時的方式基本相同。</P>
<P> <STRONG>具體到業務</STRONG></P>
<P> 在本文的其余部分,所有的討論都將基于一個實際的例子。起點是一個企業應用程序,要為它實現一個事務持久層。持久層是一個對象關系數據庫,它包括像
User、User Group、Roles 和 ContactInfo 這些熟悉的抽象。</P>
<P> 在深入到數據庫的要素——查詢和事務管理——之前,需要建立它的基礎:對象關系映射。我將用
Hibernate 設置它,并只使用一點 Spring。</P>
<P> <STRONG>用 Hibernate 進行 OR 映射</STRONG> </P>
<P> Hibernate 使用 XML (*.hbm.xml) 文件將 Java 類映射到表,將
JavaBean 屬性映射到數據庫表。幸運的是,有一組 XDoclet 標簽支持 Hibernate
開發,這使得創建所需要的 *.hbm.xml 文件更容易了。清單 1 中的代碼將一個 Java
類映射到數據庫表。</P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -