版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> Understanding object/relational persistence</p><p> The approach to managing persistent data has been a key design decision in every software project we’ve worked on. Given that persistent data i
2、sn’t a new or unusual requirement for Java applications, you’d expect to be able to make a simple choice among similar, well-established persistence solutions. Think of web application frameworks (Jakarta Struts versus W
3、ebWork), GUI component frameworks (Swing versus SWT), or template engines (JSP versus Velocity). Each of the competing solutions has adva</p><p> For several years, persistence has been a hot topic of debat
4、e in the Java community.Many developers don’t even agree on the scope of the problem. Is “persistence” a problem that is already solved by relational technology and extensions such as stored procedures, or is it a more p
5、ervasive problem that must be addressed by special Java component models such as EJB entity beans? Should we hand-code even the most primitive CRUD (create, read, update, delete) operations in SQL and JDBC, or should thi
6、</p><p> Hibernate is an open source ORM implementation.Hibernate is an ambitious project that aims to be a complete solution to the problem of managing persistent data in Java. It mediates the application’
7、s interaction with a relational database, leaving the developer free to concentrate on the business problem at hand. Hibernate is an non-intrusive solution. By this we mean you aren’t required to follow many Hibernate-sp
8、ecific rules and design patterns when writing your business logic and persistent cl</p><p> This article is about Hibernate. We’ll cover basic and advanced features and describe some recommended ways to dev
9、elop new applications using Hibernate.Often, these recommendations won’t be specific to Hibernate—sometimes they will be our ideas about the best ways to do things when working with persistent data, explained in the cont
10、ext of Hibernate. Before we can get started with Hibernate,however, you need to understand the core problems of object persistence and object/relational mapping. This</p><p> First, we define persistent dat
11、a management in the context of object-oriented applications and discuss the relationship of SQL, JDBC, and Java, the underlying technologies and standards that Hibernate is built on. We then discuss the socalled object/r
12、elational paradigm mismatch and the generic problems we encounter in object-oriented software development with relational databases. As this list of problems grows, it becomes apparent that we need tools and patterns to
13、minimize the</p><p> time we have to spend on the persistence-related code of our applications. After we look at alternative tools and persistence mechanisms, you’ll see that ORM is the best available solut
14、ion for many scenarios. Our discussion of the advantages and drawbacks of ORM gives you the full background to make the best decision when picking a persistence solution for your own project.</p><p> What i
15、s persistence?</p><p> Almost all applications require persistent data. Persistence is one of the fundamental concepts in application development. If an information system didn’t preserve data entered by us
16、ers when the host machine was powered off, the system would be of little practical use. When we talk about persistence in Java, we’re normally talking about storing data in a relational database using SQL. We start by ta
17、king a brief look at the technology and how we use it with Java. Armed with that information, we </p><p> Relational databases</p><p> You, like most other developers, have probably worked wit
18、h a relational database.In fact, most of us use a relational database every day. Relational technology is a known quantity. This alone is sufficient reason for many organizations to choose it. But to say only this is to
19、pay less respect than is due. Relational databases are so entrenched not by accident but because they’re an incredibly flexible and robust approach to data management.</p><p> A relational database manageme
20、nt system isn’t specific to Java, and a relational database isn’t specific to a particular application. Relational technology provides a way of sharing data among different applications or among different technologies th
21、at form part of the same application (the transactional engine and the reporting engine, for example). Relational technology is a common denominator of many disparate systems and technology platforms. Hence, the relation
22、al data model is often the com</p><p> Understanding SQL</p><p> To use Hibernate effectively, a solid understanding of the relational model and SQL is a prerequisite. You’ll need to use your
23、knowledge of SQL to tune the performance of your Hibernate application. Hibernate will automate many repetitive coding tasks, but your knowledge of persistence technology must extend beyond Hibernate itself if you want t
24、ake advantage of the full power of modern SQL databases.Remember that the underlying goal is robust, efficient management of persistent data.Let’s review</p><p> Also read An Introduction to Database System
25、s [Date 2004] for the theory, concepts, and ideals of (relational) database systems. Although the relational database is one part of ORM, the other part, of course, consists of the objects in your Java application that n
26、eed to be persisted to the database using SQL.</p><p> Using SQL in Java</p><p> When you work with an SQL database in a Java application, the Java code issues SQL statements to the database v
27、ia the Java DataBase Connectivity (JDBC) API. The SQL itself might have been written by hand and embedded in the Java code, or it might have been generated on the fly by Java code. You use the JDBC API to bind arguments
28、to query parameters, initiate execution of the query, scroll through the query result table, retrieve values from the result set, and so on. These are lowlevel data acce</p><p> Persistence in object-orient
29、ed applications</p><p> In an object-oriented application, persistence allows an object to outlive the process that created it. The state of the object may be stored to disk and an object with the same stat
30、e re-created at some point in the future.This application isn’t limited to single objects—entire graphs of interconnected objects may be made persistent and later re-created in a new process. Most objects aren’t persiste
31、nt; a transient object has a limited lifetime that is bounded by the life of the process that inst</p><p> responsible for sharing data between multiple users and multiple applications. A database managemen
32、t system also provides data-level security. When we discuss persistence in this book, we’re thinking of all these things:</p><p> ■ Storage, organization, and retrieval of structured data</p><p&g
33、t; ■ Concurrency and data integrity</p><p> ■ Data sharing</p><p> In particular, we’re thinking of these problems in the context of an object-oriented application that uses a domain model.An
34、 application with a domain model doesn’t work directly with the tabular representation of the business entities; the application has its own, object-oriented model of the business entities. If the database has ITEM and B
35、ID tables, the Java application defines Item and Bid classes.Then, instead of directly working with the rows and columns of an SQL result set, the business </p><p> relational model. Let’s take a closer loo
36、k.</p><p> 理解對象-關(guān)系持續(xù)性</p><p> 我們工作的每個軟件項目工程中,管理持續(xù)性數(shù)據(jù)的方法已經(jīng)成為一項關(guān)鍵的設(shè)計決定。對于Java應(yīng)用,持續(xù)性數(shù)據(jù)并不是一個新的或不尋常的需求,你也許曾經(jīng)期望能夠在許多相似的,已被很好構(gòu)建的持續(xù)性解決方案中簡單地進(jìn)行選擇??紤]一下Web應(yīng)用框架(Jakarta Struts 對 WebWork),GUI組件框架(Swing 對 S
37、WT),或模版工具(JSP 對 Velocity)。每一種相互競爭的解決方案都有其優(yōu)缺點,但它們至少都共享了相同的范圍與總體的方法。不幸的是,這還不是持續(xù)性技術(shù)的情形,對持續(xù)性技術(shù)相同的問題有許多不同的混亂的解決方案。</p><p> 在過去的幾年里,持續(xù)性已經(jīng)成為Java社區(qū)里一個爭論的熱點話題。對這個問題的范圍許多開發(fā)者的意見甚至還不一致。持續(xù)性還是一個問題嗎?它早已被關(guān)系技術(shù)與其擴展例如存儲過程解決了。
38、或者它是一個更一般的問題,必須使用特殊的Java組件模型例如EJB實體Bean來處理?甚至SQL和JDBC中最基本的CRUD(create, read, update, delete)操作也需要進(jìn)行手工編碼,還是讓這些工作自動化?如果每一種數(shù)據(jù)庫管理系統(tǒng)都有它自己的方言,我們?nèi)绾芜_(dá)到可移植性?我們應(yīng)該完全放棄SQL并采用一種新的數(shù)據(jù)庫技術(shù),例如面向?qū)ο髷?shù)據(jù)庫系統(tǒng)嗎?爭論仍在繼續(xù),但是最近一種稱作對象-關(guān)系映射(ORM)的解決方案逐漸地被
39、接受。Hibernate就是這樣一種開源的ORM實現(xiàn)。</p><p> Hibernate是一個雄心勃勃的項目,它的目標(biāo)是成為Java中管理持續(xù)性數(shù)據(jù)問題的一種完整的解決方案。它協(xié)調(diào)應(yīng)用與關(guān)系數(shù)據(jù)庫的交互,讓開發(fā)者解放出來專注于手中的業(yè)務(wù)問題。Hibernate是一種非強迫性的解決方案。我們的意思是指在寫業(yè)務(wù)邏輯與持續(xù)性類時,你不會被要求遵循許多Hibernate特定的規(guī)則和設(shè)計模式。這樣,Hibernate
40、就可以與大多數(shù)新的和現(xiàn)有的應(yīng)用平穩(wěn)地集成,而不需要對應(yīng)用的其余部分作破壞性的改動。</p><p> 本篇文章是關(guān)于Hibernate的。我們包含了基本與高級的特征,并且描述了許多使用Hibernate開發(fā)新應(yīng)用時的推薦方式。通常這些推薦并不特定于Hibernate——有時它們可能是我們關(guān)于使用持續(xù)性數(shù)據(jù)工作時處理事情的最佳方式的一些想法,只不過在Hibernate的環(huán)境中進(jìn)行了介紹。然而,在我們可以開始使用H
41、ibernate之前,你需要理解對象持續(xù)性和對象-關(guān)系映射的核心問題。本章解釋了為什么像Hibernate這樣的工具是必需的。</p><p> 首先,我們定義了在面向?qū)ο蟮膽?yīng)用環(huán)境中持續(xù)性數(shù)據(jù)的管理,并且討論了SQL,JDBC和Java的關(guān)系,Hibernate就是在這些基礎(chǔ)的技術(shù)與標(biāo)準(zhǔn)之上構(gòu)建的。然后我們討論了所謂的對象-關(guān)系范例不匹配的問題和使用關(guān)系數(shù)據(jù)庫進(jìn)行面向?qū)ο蟮能浖_發(fā)中所遇到的一些一般性的問題。
42、隨著這個問題列表的增長,我們需要一些工具與模式來最小化我們用在與持續(xù)性有關(guān)的代碼上的時間就變得很明顯了。在我們查看了可選的工具和持續(xù)性機制后,你會發(fā)現(xiàn)ORM在許多情況下可能是最好的解決方案。我們關(guān)于ORM的優(yōu)缺點的討論給了你一個完整的背景,在你為自己的項目選擇持續(xù)性解決方案時可以作出最好的決定。</p><p><b> 什么是持續(xù)性?</b></p><p>
43、幾乎所有的應(yīng)用都需要持續(xù)性數(shù)據(jù)。持續(xù)性在應(yīng)用開發(fā)中是一個基本的概念。如果當(dāng)主機停電時一個信息系統(tǒng)沒有保存用戶輸入的數(shù)據(jù),這樣的系統(tǒng)幾乎沒有實際的用途。當(dāng)我們討論Java中的持續(xù)性時,我們通常是指使用SQL存儲在關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)。我們從簡單地查看一下這項技術(shù)和我們?nèi)绾卧贘ava中使用它開始。具有了這些知識之后,我們繼續(xù)關(guān)于持續(xù)性的討論以及如何在面向?qū)ο蟮膽?yīng)用中實現(xiàn)它。</p><p><b> 關(guān)系數(shù)
44、據(jù)庫</b></p><p> 你,像許多其他的開發(fā)者,很可能在使用一個關(guān)系數(shù)據(jù)庫進(jìn)行工作。實際上,我們中的大多數(shù)每天都在使用關(guān)系數(shù)據(jù)庫。關(guān)系技術(shù)是一個已知數(shù)。僅此一點就是許多組織選擇它的一個充分的理由。但僅僅這樣說就有點欠考慮了。關(guān)系數(shù)據(jù)庫如此不易改變不是因為偶然的原因而是因為它們那令人難以置信的靈活與健壯的數(shù)據(jù)管理方法。</p><p> 關(guān)系數(shù)據(jù)庫管理系統(tǒng)既不特定于J
45、ava,也不特定于特殊的應(yīng)用。關(guān)系技術(shù)提供了一種在不同的應(yīng)用或者相同應(yīng)用的不同技術(shù)(例如事務(wù)工具與報表工具)之間共享數(shù)據(jù)的方式。關(guān)系技術(shù)是多種不同的系統(tǒng)與技術(shù)平臺之間的一個共同特征。因此,關(guān)系數(shù)據(jù)模型通常是業(yè)務(wù)實體共同的企業(yè)級表示。關(guān)系數(shù)據(jù)庫管理系統(tǒng)具有基于SQL的應(yīng)用編程接口,因此我們稱今天的關(guān)系數(shù)據(jù)庫產(chǎn)品為SQL數(shù)據(jù)庫管理系統(tǒng),或者當(dāng)我們討論特定系統(tǒng)時,稱之為SQL數(shù)據(jù)庫。</p><p><b>
46、 理解SQL</b></p><p> 為了有效地使用Hibernate,對關(guān)系模型和SQL扎實的理解是前提條件。你需要用你的SQL知識來調(diào)節(jié)你的Hibernate應(yīng)用的性能。Hibernate會自動化許多重復(fù)的編碼任務(wù),如果你想利用現(xiàn)代SQL數(shù)據(jù)庫的全部能力,你的持續(xù)性技術(shù)的知識必須擴充至超過Hibernate本身。記住基本目標(biāo)是健壯地有效地管理持續(xù)性數(shù)據(jù)。</p><p&g
47、t; 讓我們回顧一些本書中用到的SQL術(shù)語。你使用SQL作為數(shù)據(jù)定義語言(DDL)通過CREATE與ALTER命令來創(chuàng)建數(shù)據(jù)庫模式。創(chuàng)建了表(索引,序列等等)之后,你又將SQL作為數(shù)據(jù)處理語言(DML)來使用。使用DML,你執(zhí)行SQL操作來處理與取出數(shù)據(jù)。處理操作包括插入,更新和刪除。你使用約束,投射,和連接操作(包括笛卡爾積)執(zhí)行查詢來取出數(shù)據(jù)。為了有效地生成報表,你以任意的方式使用SQL來分組,排序和合計數(shù)據(jù)。你甚至可以相互嵌套S
48、QL命令,這項技術(shù)被稱作子查詢。你也許已經(jīng)使用了多年的SQL并且非常熟悉用它編寫的基本操作和命令。盡管如此,我們的經(jīng)驗還是告訴我們SQL有時難于記憶并且有些術(shù)語有不同的用法。為了理解本書,我們不得不使用相同的術(shù)語與概念;因此,如果我們提到的任何術(shù)語是新出</p><p> 現(xiàn)的或者是不清楚的。 為了進(jìn)行健全的Java數(shù)據(jù)庫應(yīng)用開發(fā),SQL知識是強制的。如果你需要更多的資料,找一本Dan Tow的優(yōu)秀著作《SQL
49、 Tuning》。同時讀一下《An Introduction to Database Systems》,學(xué)習(xí)一些(關(guān)系)數(shù)據(jù)庫系統(tǒng)的理論,概念和思想。關(guān)系數(shù)據(jù)庫是ORM的一部分,當(dāng)然另一部分由你的Java應(yīng)用中的對象構(gòu)成,它們需要使用SQL被持續(xù)化到數(shù)據(jù)庫中。</p><p> 在Java中使用SQL</p><p> 當(dāng)你在Java應(yīng)用中使用SQL工作時,Java代碼通過Java數(shù)據(jù)
50、庫連接(JDBC)執(zhí)行SQL命令來操作數(shù)據(jù)庫。SQL可能被手工編碼并嵌入到Java代碼中,或者可能被匆忙地通過Java代碼生成。你使用JDBC API將變量綁定到查詢參數(shù)上,開始執(zhí)行查詢,在查詢結(jié)果表上滾動,從結(jié)果集中取出值,等等。這些都是底層的數(shù)據(jù)訪問任務(wù),作為應(yīng)用開發(fā)者,我們對需要這些數(shù)據(jù)訪問的業(yè)務(wù)問題更加感興趣。需要我們自己來關(guān)心這些單調(diào)的機械的細(xì)節(jié),好像并不是確定無疑的。</p><p> 我們真正想做
51、的是能夠編寫保存和取出復(fù)雜對象(我們的類實例)的代碼—從數(shù)據(jù)庫中取出或者保存到數(shù)據(jù)庫中,盡量為我們減少這些底層的苦差事。因為這些數(shù)據(jù)訪問任務(wù)通常都是非常單調(diào)的,我們不禁要問:關(guān)系數(shù)據(jù)模型特別是SQL是面向?qū)ο蟮膽?yīng)用中持續(xù)性問題的正確選擇嗎?我們可以立即回答這個問題:是的!有許多原因使SQL數(shù)據(jù)庫支配了計算行業(yè)。關(guān)系數(shù)據(jù)庫管理系統(tǒng)是唯一被證明了的數(shù)據(jù)管理技術(shù)并且?guī)缀踉谌魏蜫ava項目中都是一項需求。</p><p>
52、; 然而,在過去的15年里,開發(fā)者一直在討論范例不匹配的問題。這種不匹配解釋了為什么每個企業(yè)項目都需要在持續(xù)性相關(guān)的問題上付出如此巨大的努力。這里所說的范例是指對象模型和關(guān)系模型,或者可能是面向?qū)ο缶幊膛cSQL。讓我們通過詢問在面向?qū)ο蟮膽?yīng)用開發(fā)環(huán)境中,持續(xù)性究竟意味著什么,來開始我們對不匹配問題的探究。首先,我們將本章開始部分聲明的對持續(xù)性過分簡單的定義擴展到一個較寬的范圍,更成熟的理解包括維護與使用持續(xù)性數(shù)據(jù)。</p>
53、<p> 面向?qū)ο髴?yīng)用中的持續(xù)性</p><p> 在面向?qū)ο蟮膽?yīng)用中,持續(xù)性允許一個對象的壽命可以超過創(chuàng)建它的程序。這個對象的狀態(tài)可能被存儲到磁盤上,并且在將來的某一時刻相同狀態(tài)的對象可以被重新創(chuàng)建。這樣的應(yīng)用不僅僅限于簡單的對象——關(guān)聯(lián)對象的完整圖形也可以被持續(xù)化并且以后可以在新的進(jìn)程里被重新創(chuàng)建。大多數(shù)對象并不是持續(xù)性的;暫態(tài)對象只有有限的壽命,被實例化它的進(jìn)程的壽命所限定。幾乎所有的Ja
54、va應(yīng)用都在混合使用持續(xù)與暫態(tài)對象;因此,我們需要一個子系統(tǒng)來管理我們的持續(xù)性數(shù)據(jù)?,F(xiàn)代的關(guān)系數(shù)據(jù)庫為持續(xù)性數(shù)據(jù)提供了一種結(jié)構(gòu)化的表示方法,允許排序,檢索和合計數(shù)據(jù)。數(shù)據(jù)庫管理系統(tǒng)負(fù)責(zé)管理并發(fā)性和數(shù)據(jù)的完整性;它們負(fù)責(zé)在多個用戶和多個應(yīng)用之間共享數(shù)據(jù)。數(shù)據(jù)庫管理系統(tǒng)也提供了數(shù)據(jù)級別的安全性。當(dāng)我們在本書中討論持續(xù)性時,我們考慮以下這些事情:</p><p> ■ 存儲,組織與恢復(fù)結(jié)構(gòu)化數(shù)據(jù)</p>
55、<p> ■ 并發(fā)性與數(shù)據(jù)完整性</p><p><b> ■ 數(shù)據(jù)共享</b></p><p> 特別地,我們將在使用域模型的面向?qū)ο蟮膽?yīng)用環(huán)境中考慮這些問題。使用域模型的應(yīng)用并不直接使用業(yè)務(wù)實體的扁平表示進(jìn)行工作,這些應(yīng)用有它們自己的面向?qū)ο蟮臉I(yè)務(wù)實體模型。如果數(shù)據(jù)庫中有“項目”與“競價”表,則在這些Java應(yīng)用中會定義“項目”與“競價”類。&l
56、t;/p><p> 然后,業(yè)務(wù)邏輯并不直接在SQL結(jié)果集的行與列上進(jìn)行工作,而是與面向?qū)ο蟮挠蚰P瓦M(jìn)行交互,域模型在運行時表現(xiàn)為一個關(guān)聯(lián)對象的交互圖。業(yè)務(wù)邏輯從不在數(shù)據(jù)庫中(作為SQL存儲過程)執(zhí)行,而是被實現(xiàn)在Java程序中。這就允許業(yè)務(wù)邏輯使用成熟的面向?qū)ο蟮母拍?,例如繼承與多態(tài)。我們可以使用眾所周知的設(shè)計模式例如“策略”,“中介者”和“組合” ,所有這些模式都依賴于多態(tài)方法調(diào)用?,F(xiàn)在給你一個警告:并不是所有的
57、Java應(yīng)用都是按照這種方式設(shè)計的,并且也不打算是。對于簡單的應(yīng)用不使用域模型可能會更好。SQL和JDBC API可以完美地處理純扁平數(shù)據(jù),并且現(xiàn)在新的JDBC結(jié)果集已經(jīng)使CRUD操作變得更簡單了。使用持續(xù)性數(shù)據(jù)的扁平表示進(jìn)行工作可能更直接并且更容易理解。</p><p> 然而,對于含有復(fù)雜業(yè)務(wù)邏輯的應(yīng)用,域模型有助于有效地提高代碼的可重用性和可維護性。在本書中我們集中在使用域模型的應(yīng)用上,因為通常Hiber
58、nate和ORM總是與這種類型的應(yīng)用有關(guān)。如果我們再次考慮SQL和關(guān)系數(shù)據(jù)庫,我們最終會發(fā)現(xiàn)這兩種范例的不匹配之處。</p><p> SQL操作例如投射與連接經(jīng)常會導(dǎo)致對結(jié)果數(shù)據(jù)的扁平表示。這與在Java應(yīng)用中用來執(zhí)行業(yè)務(wù)邏輯的關(guān)聯(lián)對象的表示完全不同!這是根本不同的模型,而不僅僅是相同模型的不同的顯示方式。</p><p> 帶著這些認(rèn)識,我們能夠開始看一下這些問題——許多已經(jīng)很好理
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論