第8章 Hibernate.doc_第1頁
第8章 Hibernate.doc_第2頁
第8章 Hibernate.doc_第3頁
第8章 Hibernate.doc_第4頁
第8章 Hibernate.doc_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

煙臺華東電子軟件技術有限公司第8章 hibernate數(shù)據(jù)源層O/R Mapping主要介紹三層架構,如何分層?(邏輯上的分層,二個原則)數(shù)據(jù)層技術的選擇:直接使用SQL/JDBC:優(yōu)點:很多開發(fā)者熟悉關系數(shù)據(jù)庫管理系統(tǒng),理解SQL,也知道如何使用表和外鍵進行工作。此外,他們可以始終使用眾所周知并廣泛使用的DAO設計模式對業(yè)務邏輯隱藏復雜的JDBC代碼和不可移植的SQL。缺點:為域中的每個類手工編寫持續(xù)性代碼的工作是非??捎^的,特別是需要支持多種SQL方言時。這項工作通常會消耗很大一部分的開發(fā)努力。此外,當需求改變時,一個手工編碼的解決方案總是需要更多的注意和維護努力。序列化:Java有一個內建的持久化機制:序列化提供了將對象圖(應用狀態(tài))寫到字節(jié)流中的能力,然后它可能被持久化到文件或數(shù)據(jù)庫中。持久化也被Java的遠程方法調用(RMI)使用來為復雜對象傳遞值語義。持久化的另一種用法是在機器集群中跨節(jié)點復制應用狀態(tài)。缺點:很不幸,一個相互連接的對象圖在序列化之后只能被當作一個整體訪問,如果不反序列化整個流就不可能從流中取出任何數(shù)據(jù)。這樣,結果字節(jié)流肯定會被認為不適合進行任意的檢索或聚合。甚至不可能獨立地訪問或更新一個單獨的對象或子圖。非常明顯,因為當前特定的技術,序列化不適合于作為高并發(fā)性的Web和企業(yè)應用的持久化機制。在特定的環(huán)境中它被作為桌面應用的適當?shù)某志没瘷C制。EJB entity beansEJB1.1實體Bean在實踐中徹底地失敗了。EJB規(guī)范的設計缺陷阻礙了Bean管理的持續(xù)性(BMP)實體Bean有效地執(zhí)行。在EJB1.1許多明顯的缺陷被糾正之后,一個邊緣的稍微可接受的解決方案是容器管理的持續(xù)性(CMP)。然而,CMP并不能表示一種對象-關系不匹配的解決方案。CMP缺點: CMP實體Bean的粒度既太粗又太細:CMP Bean與關系模型中的表是按照一對一的方式定義的。這樣,它們的粒度過粗,不能夠完全利用Java豐富的類型。 雖然EJB可以利用繼承實現(xiàn),但實體Bean并不支持多態(tài)的關聯(lián)和查詢 不管EJB規(guī)范所宣稱的目標,實體Bean實際上是不可移植的。CMP引擎的性能因廠商而異,并且映射元數(shù)據(jù)也是高度特定于廠商的。 實體Bean不可序列化。我們發(fā)現(xiàn)當我們需要將數(shù)據(jù)傳輸?shù)竭h程客戶層時,我們必須定義額外的數(shù)據(jù)傳輸對象(DTO,也被稱作值對象) 實體Bean必須依賴于EJB容器測試困難。JDO、Object-oriented database systems大多數(shù)面向對象的數(shù)據(jù)庫系統(tǒng)對ODMG標準都提供了許多程度的支持,但據(jù)我們所知,還沒有完全的實現(xiàn)。此外,在規(guī)范發(fā)布以后的很多年,甚至到了3.0版,還是感覺不太成熟,并且缺乏很多有用的特征,特別是基于Java環(huán)境的。ODMG也不再活躍。最近,Java數(shù)據(jù)對象(JDO)規(guī)范(發(fā)表于2002年4月)揭開了新的可能性。JDO由面向對象數(shù)據(jù)庫團體的成員驅動,除了對現(xiàn)有的ODMG的支持之外,面向對象的數(shù)據(jù)庫產(chǎn)品現(xiàn)在還經(jīng)常將其作為主要的API采用。JDO 的優(yōu)點在于它很簡單。開發(fā)人員使用 Java 語言持久存儲對象實例并從存儲器檢索實例。處理邏輯、同步和故障轉移等均被透明地處理。開發(fā)人員無需使用 SQL 或 Java 語言提供的不便的序列化機制,只使用 POJO(無格式普通 Java 對象)即可,利用 JDO 接口將對象引用傳遞到存儲器中并從存儲器檢索對象引用。O/R Mapping什么是O/R Mapping?它有什么優(yōu)點?簡單地說,對象-關系映射就是Java應用中的對象到關系數(shù)據(jù)庫中的表的自動的(和透明的)持久化,使用元數(shù)據(jù)(meta data)描述對象與數(shù)據(jù)庫間的映射。本質上,ORM的工作是將數(shù)據(jù)從一種表示(雙向)轉換為另一種。提高生產(chǎn)率(Productivity)與持久性有關的代碼可能是Java應用中最乏味的代碼。Hibernate去掉了很多讓人心煩的工作(多于你的期望),讓你可以集中更多的精力到業(yè)務問題上。不論你喜歡哪種應用開發(fā)策略自頂向下,從域模型開始;或者自底向上,從一個現(xiàn)有的數(shù)據(jù)庫模式開始使用Hibernate和適當?shù)墓ぞ邔p少大量的開發(fā)時間??删S護性(Maintainability) 減少了代碼,重構更方便,提高了可維護性。ORM是對象和關系數(shù)據(jù)庫之間的緩沖區(qū),用來很好的將他們隔離。更好性能(Performance)ORM軟件的實現(xiàn)人員可能有比你更多的時間來研究性能優(yōu)化問題。你知道嗎,例如,緩存PreparedStatement的實例對DB2的JDBC驅動導致了一個明顯的性能增長但卻破壞了InterBase的JDBC驅動?你了解嗎,對某些數(shù)據(jù)庫只更新一個表中被改變的字段可能會非??斓珴撛诘貙ζ渌膮s很慢?在你手工編寫的解決方案中,對這些不同策略之間的沖突進行試驗是多么不容易呀?廠商獨立性(Vendor independence)ORM抽象了你的應用使用下層SQL數(shù)據(jù)庫和SQL方言的方式。如果工具支持許多不同的數(shù)據(jù)庫(dialect),那么這會給你的應用帶來一定程度的可移植性。你不必期望可以達到“一次編寫,到處運行”,因為數(shù)據(jù)庫的性能不同并且達到完全的可移植性需要犧牲更強大的平臺的更多的力氣。然而,使用ORM開發(fā)跨平臺的應用通常更容易。即使你不需要跨平臺操作,ORM依然可以幫你減小被廠商鎖定的風險。另外,數(shù)據(jù)庫獨立性對這種開發(fā)情景也有幫助:開發(fā)者使用一個輕量級的本地數(shù)據(jù)庫進行開發(fā)但實際產(chǎn)品需要配置在一臺不同的數(shù)據(jù)庫上。如何做對象關系數(shù)據(jù)庫映射?(最后引入Hibernate)public class User private Long id;private String name;private List address;create table tbl_user (id bigint not null auto_increment, name varchar(255), primary key (id)Java數(shù)據(jù)庫類的屬性(基本類型)表的列類表1:n/n:1外鍵n:m關聯(lián)表繼承單表繼承、具體表繼承、類表繼承1、 Java基本類型表的2、 Java類的映射3、 關聯(lián)的映射:例如一個User有多個Address,User和Address管理,User刪除時,相應的Address也應該刪除。對象關系的不匹配范式(paradigm)1、 粒度(granularity)的問題。 增加一種新的數(shù)據(jù)類型,將Java地址對象在我們的數(shù)據(jù)庫中保存為單獨的一列,聽起來好像是最好的方法。畢竟,Java中的一個新的地址類與SQL數(shù)據(jù)類型中的一個新的地址類型可以保證互用性。然而,如果你檢查現(xiàn)在的數(shù)據(jù)庫管理系統(tǒng)對用戶定義列類型(UDT)的支持,你將會發(fā)現(xiàn)各種各樣的問題。2、 子類型(subtypes)的問題。 子類型不匹配是指Java模型中的繼承結構必須被持續(xù)化到SQL數(shù)據(jù)庫中,而SQL數(shù)據(jù)庫并沒有提供一個支持繼承的策略。如何解決多態(tài)?3、 同一性(identity)的問題Java對象定義了兩種不同的相等性的概念: 對象同一性(粗略的等同于內存位置的相等,使用a=b檢查) 通過equals()方法的實現(xiàn)來決定的相等性(也被稱作值相等)另一方面,數(shù)據(jù)庫行的同一性使用主鍵值表示。主鍵既不必然地等同于“equals()”也不等同于“=”。它通常是指幾個對象(不相同的)同時表示了數(shù)據(jù)庫中相同的行。而且,為一個持續(xù)類正確地實現(xiàn)equals()方法包含許多微妙的難點。4、 與關聯(lián)(associations)有關的問題面向對象的語言使用對象引用和對象引用的集合表示關聯(lián)。在關系世界里,關聯(lián)被表示為外鍵列,外鍵是幾個表的鍵值的拷貝。這兩種表示之間有些微妙的不同。5、 對象結構導航的問題在Java中訪問對象的方式與在關系數(shù)據(jù)庫中有根本的不同。在Java中,訪問用戶的賬單信息時,你調用aUser.getBillingDetails().getAccountNumber()。這是最自然的面向對象數(shù)據(jù)的訪問方式,通常被形容為遍歷對象圖。根據(jù)實例間的關聯(lián),你從一個對象導航到另一個對象。不幸地是,這不是從SQL數(shù)據(jù)庫中取出數(shù)據(jù)的有效方式。為了提高數(shù)據(jù)訪問代碼的性能,唯一重要的事是最小化數(shù)據(jù)庫請求的次數(shù)。最明顯的方式是最小化SQL查詢的數(shù)量(其它方式包括使用存儲過程或者JDBC批處理API)。使用SQL有效地訪問關系數(shù)據(jù)通常需要在有關的表之間使用連接。在連接中包含的表的數(shù)量決定了你可以導航的對象圖的深度。性能:N+1的問題 范式不匹配的代價:1、花費很多時間和精力來手工解決對象和關系的不匹配。2、為了解決不匹配,甚至要扭曲對象模型直到它與下層的關系技術匹配為止4、 JDBC API本身的問題。JDBC和SQL提供了一個面向語句(即命令)的方法從SQL數(shù)據(jù)庫中來回移動數(shù)據(jù)。至少在三個時刻(Insert,Update,Select)必須指定一個結構化關系,這增加了設計和實現(xiàn)所需要的時間。主流持久層框架縱覽目前眾多廠商和開源社區(qū)都提供了持久層框架實現(xiàn),常見的有:Apache OJB(/ojb/ )Cayenne(/cayenne/ )Jaxor( )Hibernate()iBATIS( )jRelationalFramework()mirage(/en/oss/mirage/toon)SMYLE(http:/www.drjava.de/smyle/)TopLink(/products/ias/toplink/index.html )(其中TopLink 是Oracle 的商業(yè)產(chǎn)品。其他均為開源項目)Apache OJB 的優(yōu)勢在于對各種標準的全面支持(不過事實上,我們的系統(tǒng)研發(fā)中并不需要同時支持這么多標準,追求多種標準的并行支持本身也成為Apache OJB 項目發(fā)展的沉重包袱),且其從屬于Apache 基金組織,有著可靠的質量保證和穩(wěn)定的發(fā)展平臺。Hibernate 在2003 年末被JBoss 組織收納,成為從屬于JBoss 組織的子項目之一,從而贏得了良好的發(fā)展前景(同時榮獲Jolt 2004 大獎)。Hibernate 與OJB 設計思想類似,具備相近的功能和特色,但由于其更加靈活快速的發(fā)展策略,得到了廣大技術人員的熱情參與,因此也得到了更廣泛的推崇。相對ApacheOJB 遲鈍的項目開發(fā)進度表,Hibernate 活躍的開發(fā)團隊以及各社區(qū)內對其熱烈的關注為其帶來了極大的活力,并逐漸發(fā)展成Java 持久層事實上的標準。iBATIS 相對Apache OJB 和Hibernate 項目則另具特色,iBATIS 采取了更加開放式的設計,通過iBATIS,我們可以控制更多的數(shù)據(jù)庫操作細節(jié)。相對而言,Hibernate、Apache OJB 對持久層的設計則較為封閉,封閉化的設計對持久層進行了較為徹底的封裝,從而將底層細節(jié)與上層架構完全分離,大多數(shù)情況下,特別是對于新系統(tǒng),新產(chǎn)品的研發(fā)而言,封閉化的設計帶來了更高的開發(fā)效率和更好的封裝機制,但是在某些情況下,卻又為一些必須的底層調整帶來了阻力,如在對遺留系統(tǒng)的改造和對既有數(shù)據(jù)庫的復用上,表現(xiàn)出靈活性不足的弱點。此時作為OJB,Hibernate 的一個有益補充,iBATIS的出現(xiàn)顯得別具意義。Hibernate入門Hibernate概述Hibernate是非常優(yōu)秀、成熟的O/R Mapping框架。它提供了強大、高性能的Java對象和關系數(shù)據(jù)的持久化和查詢功能。(O/R Mapping是一項實用的工程技術,把數(shù)據(jù)庫的E/R模型用java的OO語法描述出來,Hibernate是其中的當之無愧的最耀眼的明星,cglib動態(tài)增強,多種靈活的class繼承樹映射機制,廣泛的社團支援,掩蓋了其他項目的光輝。)Hibernate的優(yōu)勢 開源(LGPL) 成熟 流行(約13 000 downloads/month) 自定義APIJBoss 將用Hibernate3實現(xiàn)Entity Beans使用Hibernate的開發(fā)步驟1、 設計一般首先進行領域對象的設計。因為在Hibernate中,我們的領域對象可以直接充當持久化類。2、 映射定義Hibernate的映射文件,實現(xiàn)持久化類和數(shù)據(jù)庫之間映射。3、 應用使用Hibernate提供的API,實現(xiàn)具體的持久化業(yè)務。Hibernate的映射Entity-hbm-ddl(數(shù)據(jù)庫)(hbm(hibernate mapping)和ddl(Data Definition Language)的全稱)之間的互相轉換User.java User.hbm.xmlXDoclet:它通過在Java源代碼中加入特定的JavaDoc tag,從而為其添加特定的附加語義,之后通過XDoclet工具對代碼中JavaDoc Tag進行分析,自動生成與代碼對應的配置文件(/)。XDoclet提供了對Hibernate的支持,這樣我們可以直接由Java代碼生成Hibernate映射文件。Middlegen: 用來從數(shù)據(jù)庫中已有的表結構中生成Hibernate映射文件。當前版本是2.1可以去http:/boss.bekk.no/boss/middlegen下載。Hibernate核心接口Configuration:正如其名,Configuration 類負責管理Hibernate 的配置信息。Hibernate 運行時需要獲取一些底層實現(xiàn)的基本信息,其中幾個關鍵屬性包括:1、數(shù)據(jù)庫URL2、數(shù)據(jù)庫用戶3、數(shù)據(jù)庫用戶密碼4、數(shù)據(jù)庫JDBC驅動類5、 數(shù)據(jù)庫dialect,用于對特定數(shù)據(jù)庫提供支持,其中包含了針對特定數(shù)據(jù)庫特性的實現(xiàn),如Hibernate數(shù)據(jù)類型到特定數(shù)據(jù)庫數(shù)據(jù)類型的映射等。當然,還有指定Hibernate映射文件的位置。(*.hbm.xml)。Hibernate配置有兩種方法:一、 屬性文件配置。默認文件名是perties。調用代碼: Configuration config = new Configuration();二、 XML文件配置。默認文件名是hibernate.cfg.xml。Configuration config = new Configuration().configure();SessionFactory:應用程序從SessionFactory(會話工廠)里獲得Session(會話)實例。它打算在多個應用線程間進行共享。通常情況下,整個應用只有唯一的一個會話工廠例如在應用初始化時被創(chuàng)建。然而,如果你使用Hibernate訪問多個數(shù)據(jù)庫,你需要對每一個數(shù)據(jù)庫使用一個會話工廠。會話工廠緩存了生成的SQL語句和Hibernate在運行時使用的映射元數(shù)據(jù)。它也保存了在一個工作單元中讀入的數(shù)據(jù)并且可能在以后的工作單元中被重用(只有類和集合映射指定了使用這種二級緩存時才會如此)。SessionFactory sessionFactory = config.buildSessionFactory();Session(會話):該接口是Hibernate使用最多的接口。Session不是線程安全的,它代表與數(shù)據(jù)庫之間的一次操作。Session通過SessionFactory打開,在所有的工作完成后,需要關閉:它的概念介于Connection和Transaction之間。我們可以簡單的認為它是已經(jīng)裝載對象的緩存或集合的一個獨立工作單元。我們有時也稱Session為持久化管理器,因為它是與持久化有關的操作的接口。Hibernate會話并不是線程安全的因此應該被設計為每次只能在一個線程中使用。Hibernate會話與Web層的HttpSession沒有任何關系。Session session = sessionFactory.openSession();Transaction:事務將應用代碼從底層的事務實現(xiàn)中抽象出來這可能是一個JDBC事務,一個JTA用戶事務或者甚至是一個公共對象請求代理結構(CORBA)允許應用通過一組一致的API控制事務邊界。這有助于保持Hibernate應用在不同類型的執(zhí)行環(huán)境或容器中的可移植性。Transaction trans = session.beginTransaction ();Query: Query(查詢)接口允許你在數(shù)據(jù)庫上執(zhí)行查詢并控制查詢如何執(zhí)行。查詢語句使用HQL或者本地數(shù)據(jù)庫的SQL方言編寫。Query query = session.createQuery(“from User”);Lifecycle:Lifecycle接口提供了一些回調方法,可以讓持久化對象在save或load之后,或者在delete或update之前進行必要的初始化與清除步驟。public interface Lifecycle public boolean onSave(Session s) throws CallbackException; (1) public boolean onUpdate(Session s) throws CallbackException; (2) public boolean onDelete(Session s) throws CallbackException; (3) public void onLoad(Session s, Serializable id); (4)(1) onSave - 在對象即將被save或者insert的時候回調 (2) onUpdate - 在對象即將被update的時候回調(也就是對象被傳遞給Session.update()的時候) (3) onDelete - 在對象即將被delete(刪除)的時候回調 (4) onLoad - 在對象剛剛被load(裝載)后的時候回調Validatable: 該接口是合法性檢查的回調。如果持久化類需要在保存其持久化狀態(tài)前進行合法性檢查,它可以實現(xiàn)下面的接口: public interface Validatable public void validate() throws ValidationFailure;如果發(fā)現(xiàn)對象違反了某條規(guī)則,應該拋出一個ValidationFailure異常。在Validatable實例的validate()方法內部不應該改變它的狀態(tài)。 和Lifecycle接口的回調方法不同,validate()可能在任何時間被調用。應用程序不應該把validate()調用和商業(yè)功能聯(lián)系起來。Interceptor: Interceptor接口提供從session到你的應用程序的回調方法,讓你的程序可以觀察和在持久化對象保存/更改/刪除或者裝載的時候操作它的屬性。一種可能的用途是用來監(jiān)視統(tǒng)計信息。比如,下面的Interceptor會自動在一個Auditable創(chuàng)建的時候設置其createTimestamp,并且當它被更改的時候,設置其lastUpdateTimestamp屬性。UserType: 開發(fā)者創(chuàng)建屬于他們自己的值類型也是很容易的。比如說,你可能希望持久化java.lang.BigInteger類型的屬性,持久化成為VARCHAR字段。Hibernate沒有內置這樣一種類型。自定義類型能夠映射一個屬性(或集合元素)到不止一個數(shù)據(jù)庫表字段。比如說,你可能有這樣的Java屬性:getName()/setName(),這是java.lang.String類型的,對應的持久化到三個字段:FIRST_NAME, INITIAL, SURNAME。 要實現(xiàn)一個自定義類型,可以實現(xiàn)net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType中的任一個,并且使用類型的Java全限定類名來聲明屬性。請查看net.sf.hibernate.test.DoubleStringType這個例子,看看它是怎么做的。 注意使用標簽來把一個屬性映射到多個字段的做法。用戶的例子設計:用戶,id name映射:User.java User.hbm.xml一、安裝二、持久化類(Persistent Class)持久化類不需要實現(xiàn)什么特別的接口,也不需要從一個特別的持久化根類繼承下來。Hibernate也不需要使用任何編譯期處理,比如字節(jié)碼增強操作,它獨立的使用Java反射機制和運行時類增強(通過CGLIB)。所以,在Hibernate中,POJO的類不需要任何前提條件,我們就可以把它映射成為數(shù)據(jù)庫表。持久化類必須遵循的原則:1、 為類的持久化類字段申明訪問方法(Get/set)。Hibernate對JavaBeans風格的屬性實行持久化。2、 實現(xiàn)一個默認的構造方法(constructor)。這樣的話Hibernate就可以使用Constructor.newInstance()來實例化它們。3、 如果是集合類型的屬性,它的類型必須定義為集合的接口。例如:List、Set4、 提供一個標識屬性(identifier property)。如果沒有該屬性,一些功能不起作用,比如:級聯(lián)更新(Cascaded updates)Session.saveOrUpdate()。三、 hibernate映射文件四、應用:TestUser.java之后做個總結,特別是CRUD操作。Hibernate映射聲明(Mapping declaration)一、 DOCTYPE聲明。一個XML document應該在文檔的起始位置有一個XML的聲明,可能跟隨著一個DOCTYPE的聲明。一個DOCTYPE聲明告訴一個XML parser這個XML文檔遵循了哪一個DTD(Document Type Declaration)。Parser可以用此信息來確認這個XML文檔包含的僅是這個DTD聲明的XML element。例如:DTD可以從上述URL中獲取,或者在hibernate-x.x.x/src/net/sf/hibernate目錄中,或hibernate.jar文件中找到。Hibernate總是會在它的classptah中首先搜索DTD文件。二、 hibernate-mapping它是文檔的根(root),可以包含多個類的映射,但一般只包含一個類。(1)、schema(可選):數(shù)據(jù)庫Schema Name(2)、default-cascade(可選,默認為none):默認的級聯(lián)風格(3)、auto-import(可選,默認為true):是否允許在查詢語言中使用非完全限定的類名即只用類的名稱,不用加入包名(僅限本映射文件中定義的類)。(4)、package(可選),如果該映射文件中定義的類名不包含package,則使用這里定義的package作為類名的前綴。注:(3)默認的值是“true”,如果有多個類的名字相同,則必須將該值設為false。三、class用class元素來定義一個持久化類。1、 name:持久化類(或Java接口)的全名。2、 table:對應的數(shù)據(jù)庫表名。3、 discriminator-value(鑒別值)(可選,默認和類名一樣):一個用于區(qū)分不同子類的值,在多態(tài)行為中使用。4、 mutable(可選,默認值為true):表明該類是否可以改變。如果將它設為false,則應用程序不能對此類對應的數(shù)據(jù)進行修改和刪除。5、 schema(可選):覆蓋在根元素中指定的schema名字。6、 proxy(可選):指定一個接口,在延遲裝載時作為代理使用。你可以在這里使用該類自己的名字。7、 dynamic-update(動態(tài)更新) (可選,默認為false): 指定用于UPDATE 的SQL將會在運行時動態(tài)生成,并且只更新那些改變過的字段。 8、 dynamic-insert(動態(tài)插入) (可選, 默認為false): 指定用于INSERT的 SQL 將會在運行時動態(tài)生成,并且只包含那些非空值字段。 9、 select-before-update (可選,默認值為false): 指定Hibernate除非確定對象的確被修改了,不會執(zhí)行SQL UPDATE操作。在特定場合(實際上,只會發(fā)生在一個臨時對象關聯(lián)到一個新的session中去,執(zhí)行update()的時候),這說明Hibernate會在UPDATE之前執(zhí)行一次額外的SQL SELECT操作,來決定是否應該進行UPDATE。 10、 polymorphism(多形,多態(tài)) (可選, 默認值為 implicit (隱式): 界定是隱式還是顯式的使用查詢多態(tài)。 11、 where (可選) 指定一個附加的SQLWHERE 條件,在抓取這個類的對象時會一直增加這個條件。 12、 persister (可選): 指定一個定制的ClassPersister。 13、 batch-size (可選,默認是1) 指定一個用于根據(jù)標識符抓取實例時使用的batch size(批次抓取數(shù)量)。 14、 optimistic-lock(樂觀鎖定) (可選,默認是version): 決定樂觀鎖定的策略。 15、 lazy(延遲) (可選): 假若設置 lazy=true,就是設置這個類自己的名字作為proxy接口的一種等價快捷形式。四、id持久化類必須要聲明一個字段對應數(shù)據(jù)庫表的主鍵。 (5) (1)、name(可選):標識屬性的名稱。(2)、type(可選):標識Hibernate類型的名字。(3)、column(可選默認為屬性名):對應數(shù)據(jù)庫表的主鍵字段的名字。(4)、unsaved-value(可選默認為null):這個值用來判斷對象是否要保存。如果一個對象id值與該值相等時,Hibernate則會認為該對象是一個新的對象,并沒有持據(jù)化到數(shù)據(jù)庫中。舉例:假如一個新建對象的屬性id的類型為int,我們知道如果不給id賦值,它默認的值就應該是“0”,如果這時unsaved-value是默認的null。則當保存這個新建對象,調用session. SaveOrUpdate()方法時會拋出異常。因為id的值不等于null,所以Hibernate會認為該對象已經(jīng)保存,它會去執(zhí)行update操作。Generator主鍵生成器,每個主鍵都必須定義相應的主鍵生成策略。它用來為持久化類實例生成唯一的標識。例如: uid_table next_hi_value_column 所有的生成器都實現(xiàn)net.sf.hibernate.id.IdentifierGenerator接口。這是一個非常簡單的接口;某些應用程序可以選擇提供他們自己特定的實現(xiàn)。當然,Hibernate提供了很多內置的實現(xiàn)。下面是一些內置生成器的快捷名字:1、 數(shù)據(jù)庫提供的主鍵生成機制。identity、sequence、2、 外部程序提供的主鍵生成機制。increment ,hilo,seqhilo,uuid.hex,uuid.string3、 其它。native,assigned,foreignincrement(遞增):主鍵按數(shù)值順序遞增。此方式的實現(xiàn)機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候將此值加1作為主鍵。用于為long, short或者int類型生成唯一標識。只有在沒有其他進程往同一張表中插入數(shù)據(jù)時才能使用。 在集群下不要使用。identity采用數(shù)據(jù)庫提供的主鍵生成機制(數(shù)據(jù)庫內部支持標識字段)。如DB2、SQL Server、MySQL中的主鍵生成機制。返回的標識符是long, short 或者int類型的。sequence (序列):采用數(shù)據(jù)庫提供的sequence 機制生成主鍵。如Oralce 中的Sequence。hilo (高低位): 通過hi/lo算法實現(xiàn)的主鍵生成機制,需要額外的數(shù)據(jù)庫表保存主鍵生成歷史狀態(tài)。高/低位算法生成的標識符只在一個特定的數(shù)據(jù)庫中是唯一的。在使用JTA獲得的連接或者用戶自行提供的連接中,不要使用這種生成器。seqhilo(使用序列的高低位):與hilo 類似,通過hi/lo 算法實現(xiàn)的主鍵生成機制,只是主鍵歷史狀態(tài)保存在Sequence中,適用于支持Sequence的數(shù)據(jù)庫,如Oracle。uuid.hex用一個128-bit的UUID算法生成字符串類型的標識符。在一個網(wǎng)絡中唯一(使用了IP地址,JVM的啟動時間(精確到1/4秒),系統(tǒng)時間和一個計數(shù)器值(在JVM中唯一)。)。UUID被編碼為一個32位16進制數(shù)字的字符串。uuid.string使用同樣的UUID算法。UUID被編碼為一個16個字符長的任意ASCII字符組成的字符串native(本地)根據(jù)底層數(shù)據(jù)庫的能力選擇identity, sequence 或者hilo中的一個assigned(程序設置)讓應用程序在save()之前為對象分配一個標示符。foreign(外部引用)使用另外一個相關聯(lián)的對象的標識符。和聯(lián)合一起使用。五:property元素為類聲明了一個持久化的,JavaBean風格的屬性。 (1) name: 屬性的名字,以小寫字母開頭。 (2) column (可選 - 默認為屬性名字): 對應的數(shù)據(jù)庫字段名。 (3) type (可選): 一個Hibernate類型的名字。 (4) update, insert (可選 - 默認為 true) :表明在用于UPDATE 和/或 INSERT的SQL語句中是否包含這個字段。這二者如果都設置為false則表明這是一個“外源性(derived)”的屬性,它的值來源于映射到同一個(或多個)字段的某些其他屬性,或者通過一個trigger(觸發(fā)器),或者其他程序。 (5) formula (可選): 一個SQL表達式,定義了這個計算(computed) 屬性的值。計算屬性沒有和它對應的數(shù)據(jù)庫字段。 (6) access (可選 - 默認值為 property): Hibernate用來訪問屬性值的策略。六、多對一個(many-to-one)(1) name: 屬性名。 (2) column (可選): 字段名。 (3) class (可選 - 默認是通過反射得到屬性類型): 關聯(lián)的類的名字。 (4) cascade(級聯(lián)) (可選): 指明哪些操作會從父對象級聯(lián)到關聯(lián)的對象。 (5) outer-join(外連接) (可選 - 默認為 自動): 當設置hibernate.use_outer_join的時候,對這個關聯(lián)允許外連接抓取。 (6) update, insert (可選 - defaults to true) 指定對應的字段是否在用于UPDATE 和/或 INSERT的SQL語句中包含。如果二者都是false,則這是一個純粹的“外源性(derived)”關聯(lián),它的值是通過映射到同一個(或多個)字段的某些其他屬性得到的,或者通過trigger(觸發(fā)器),或者是其他程序。 (7) property-ref: (可選) 指定關聯(lián)類的一個屬性,這個屬性將會和本外鍵相對應。如果沒有指定,會使用對方關聯(lián)類的主鍵。 該屬性只應該用來對付老舊的數(shù)據(jù)庫系統(tǒng),可能出現(xiàn)外鍵指向對方關聯(lián)表的是個非主鍵字段(但是應該是一個惟一關鍵字)的情況。(8) access (可選 - 默認是 property): Hibernate用來訪問屬性的策略。七、一對多(one-to-many)(1) name 集合屬性的名稱 (2) table (可選)目標關聯(lián)數(shù)據(jù)庫表(3) lazy (可選默認為false)允許延遲加載(lazy initialization )(4) inverse (可選默認為false) 標記這個集合作為雙向關聯(lián)關系中的方向一端。 (5) cascade (可選默認為none) 讓操作級聯(lián)到子實體 (6) sort(可選默認為unsorted)指定集合的排序順序, 其可以為自然的(natural)或者給定一個用來比較的類。 (7) order-by (可選, 僅用于jdk1.4) 指定表的字段(一個或幾個)再加上asc或者desc(可選), 定義Map,Set和Bag的迭代順序 (8) where (可選) 指定任意的SQL where條件。該條件將在重新載入或者刪除這個集合時使用(當集合中的數(shù)據(jù)僅僅是所有可用數(shù)據(jù)的一個子集時這個條件非常有用)(9) outer-join(可選-默認為a

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論