成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

hibernate2和3不同之處大全

開發 后端
Hibernate 3.0 與Hibernate2.1的源代碼是不兼容的,但是當Hibernate開發小組在設計Hibernate3.0時,為簡化升級Hibernate版本作了周到的考慮。

盡管Hibernate 3.0 與Hibernate2.1的源代碼是不兼容的,但是當Hibernate開發小組在設計Hibernate3.0時,為簡化升級Hibernate版本作了周到的考慮。對于現有的基于Hibernate2.1的Java項目,可以很方便的把它升級到Hibernate3.0。
本文描述了Hibernate3.0版本的新變化,Hibernate3.0版本的變化包括三個方面:

(1)API的變化,它將影響到Java程序代碼。
(2)元數據,它將影響到對象-關系映射文件。
(3)HQL查詢語句。

值得注意的是, Hibernate3.0并不會完全取代Hibernate2.1。在同一個應用程序中,允許Hibernate3.0和Hibernate2.1并存。

1.Hibernate API 變化

1 )包名

Hibernate3.0的包的根路徑為: “org.hibernate” ,而在Hibernate2.1中為“net.sf.hibernate”。這一命名變化使得Hibernate2.1和Hibernate3.0能夠同時在同一個應用程序中運行。

如果希望把已有的應用升級到Hibernate3.0,那么升級的第一步是把Java源程序中的所有“net.sf.hibernate”替換為“org.hibernate”。

Hibernate2.1 中的“net.sf.hibernate.expression”包被改名為“org.hibernate.criterion”。假如應用程序使用了 Criteria API,那么在升級的過程中,必須把Java源程序中的所有“net.sf.hibernate.expression”替換為 “org.hibernate.criterion”。

如果應用使用了除Hibernate以外的其他外部軟件,而這個外部軟件又引用了Hibernate的接口,那么在升級時必須十分小心。例如EHCache擁有自己的CacheProvider: net.sf.ehcache.hibernate.Provider,在這個類中引用了Hibernate2.1中的接口,在升級應用時,可以采用以下辦法之一來升級EHCache:

(1)手工修改net.sf.ehcache.hibernate.Provider類,使它引用Hibernate3.0中的接口。
(2)等到EHCache軟件本身升級為使用Hibernate3.0后,使用新的EHCache軟件。
(3)使用Hibernate3.0中內置的CacheProvider:org.hibernate.cache.EhCacheProvider。

2) org.hibernate.classic包

Hibernate3.0把一些被廢棄的接口都轉移到org.hibernate.classic中。

3)Hibernate所依賴的第三方軟件包

在Hibernate3.0的軟件包的lib目錄下的README.txt文件中,描述了Hibernate3.0所依賴的第三方軟件包的變化。

4)異常模型

在Hibernate3.0中,HibernateException異常以及它的所有子類都繼承了java.lang.RuntimeException。因此在編譯時,編譯器不會再檢查HibernateException。

5)Session接口

在Hibernate3.0中,原來Hibernate2.1的Session接口中的有些基本方法也被廢棄,但為了簡化升級,這些方法依然是可用的,可以通過org.hibernate.classic.Session子接口來訪問它們,例如:
org.hibernate.classic.Session session=sessionFactory.openSession();
session.delete("delete from Customer ");
在Hibernate3.0 中,org.hibernate.classic.Session接口繼承了org.hibernate.Session接口,在 org.hibernate.classic.Session接口中包含了一系列被廢棄的方法,如find()、interate()等。 SessionFactory接口的openSession()方法返回org.hibernate.classic.Session類型的實例。如果希望在程序中完全使用Hibernate3.0,可以采用以下方式創建Session實例:

org.hibernate.Session session=sessionFactory.openSession();

如果是對已有的程序進行簡單的升級,并且希望仍然調用Hibernate2.1中Session的一些接口,可以采用以下方式創建Session實例:

org.hibernate.classic.Session session=sessionFactory.openSession();

在Hibernate3.0中,Session接口中被廢棄的方法包括:

◆執行查詢的方法:find()、iterate()、filter()和delete(String hqlSelectQuery)
◆saveOrUpdateCopy()

Hibernate3.0一律采用createQuery()方法來執行所有的查詢語句,采用DELETE 查詢語句來執行批量刪除,采用merge()方法來替代 saveOrUpdateCopy()方法。

提示:

在Hibernate2.1中,Session的delete()方法有幾種重載形式,其中參數為HQL查詢語句的delete()方法在 Hibernate3.0中被廢棄,而參數為Ojbect類型的的delete()方法依然被支持。delete(Object o)方法用于刪除參數指定的對象,該方法支持級聯刪除。

Hibernate2.1沒有對批量更新和批量刪除提供很好的支持,參見< <精通Hibernate>>一書的第13章的13.1.1節(批量更新和批量刪除),而Hibernate3.0對批量更新和批量刪除提供了支持,能夠直接執行批量更新或批量刪除語句,無需把被更新或刪除的對象先加載到內存中。以下是通過Hibernate3.0執行批量更新的程序代碼:

  1. Session session = sessionFactory.openSession();   
  2. Transaction tx = session.beginTransaction();   
  3. String hqlUpdate = "update Customer set name = :newName where name = :oldName";   
  4. int updatedEntities = s.createQuery( hqlUpdate )   
  5. .setString( "newName", newName )   
  6. .setString( "oldName", oldName )   
  7. .executeUpdate();   
  8. tx.commit();   
  9. session.close();  

以下是通過Hibernate3.0執行批量刪除的程序代碼:

  1. Session session = sessionFactory.openSession();   
  2. Transaction tx = session.beginTransaction();   
  3. String hqlDelete = "delete Customer where name = :oldName";   
  4. int deletedEntities = s.createQuery( hqlDelete )   
  5. .setString( "oldName", oldName )   
  6. .executeUpdate();   
  7. tx.commit();   
  8. session.close();   

6) createSQLQuery()

在Hibernate3.0中,Session接口的createSQLQuery()方法被廢棄,被移到org.hibernate.classic.Session接口中。Hibernate3.0采用新的SQLQuery接口來完成相同的功能。

7)Lifecycle 和 Validatable 接口

Lifecycle和Validatable 接口被廢棄,并且被移到org.hibernate.classic包中。

8)Interceptor接口

在Interceptor 接口中加入了兩個新的方法。用戶創建的Interceptor實現類在升級的過程中,需要為這兩個新方法提供方法體為空的實現。此外,instantiate()方法的參數作了修改,isUnsaved()方法被改名為isTransient()。

9)UserType和CompositeUserType接口

在UserType和CompositeUserType接口中都加入了一些新的方法,這兩個接口被移到org.hibernate.usertype包中,用戶定義的UserType和CompositeUserType實現類必須實現這些新方法。
Hibernate3.0提供了ParameterizedType接口,用于更好的重用用戶自定義的類型。
10)FetchMode類

FetchMode.LAZY 和 FetchMode.EAGER被廢棄。取而代之的分別為FetchMode.SELECT 和FetchMode.JOIN。

11)PersistentEnum類

PersistentEnum被廢棄并刪除。已經存在的應用應該采用UserType來處理枚舉類型。

12)對Blob 和Clob的支持

Hibernate對Blob和Clob實例進行了包裝,使得那些擁有Blob或Clob類型的屬性的類的實例可以被游離、序列化或反序列化,以及傳遞到merge()方法中。

13) Hibernate中供擴展的API的變化

org.hibernate.criterion、 org.hibernate.mapping、 org.hibernate.persister和org.hibernate.collection 包的結構和實現發生了重大的變化。多數基于Hibernate 2.1 的應用不依賴于這些包,因此不會被影響。如果你的應用擴展了這些包中的類,那么必須非常小心的對受影響的程序代碼進行升級。

2. 元數據的變化

1)檢索策略

在Hibernate2.1 中,lazy屬性的默認值為“false”,而在Hibernate3.0中,lazy屬性的默認值為“true”。在升級映射文件時,如果原來的映射文件中的有關元素,如、等沒有顯式設置lazy屬性,那么必須把它們都顯式的設置為lazy=“true”。如果覺得這種升級方式很麻煩,可以采取另一簡單的升級方式:在元素中設置: default-lazy=“false”。

2)對象標識符的映射

unsaved-value屬性是可選的,在多數情況下,Hibernate3.0將把unsaved-value="0" 作為默認值。

在Hibernate3.0 中,當使用自然主鍵和游離對象時,不再強迫實現Interceptor.isUnsaved()方法。如果沒有設置這個方法,當Hibernate3.0無法區分對象的狀態時,會查詢數據庫,來判斷這個對象到底是臨時對象,還是游離對象。不過,顯式的使用 Interceptor.isUnsaved()方法會獲得更好的性能,因為這可以減少Hibernate直接訪問數據庫的次數。

3)集合映射

元素在某些情況下被和元素替代。此外,Hibernate3.0用 元素來替代原來的.元素,用元素來替代原來的元素。

4)DTD

對象-關系映射文件中的DTD文檔,由原來的:
http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd
改為:
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd

3 查詢語句的變化

Hibernate3.0 采用新的基于ANTLR的HQL/SQL查詢翻譯器,不過,Hibernate2.1的查詢翻譯器也依然存在。在Hibernate的配置文件中,hibernate.query.factory_class屬性用來選擇查詢翻譯器。例如:
(1)選擇Hibernate3.0的查詢翻譯器:
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory
(2)選擇Hibernate2.1的查詢翻譯器
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory

提示:

ANTLR是用純Java語言編寫出來的一個編譯工具,它可生成Java語言或者是C++的詞法和語法分析器,并可產生語法分析樹并對該樹進行遍歷。ANTLR由于是純Java的,因此可以安裝在任意平臺上,但是需要JDK的支持。
Hibernate開發小組盡力保證Hibernate3.0的查詢翻譯器能夠支持Hibernate2.1的所有查詢語句。不過,對于許多已經存在的應用,在升級過程中,也不妨仍然使用Hibernate2.1的查詢翻譯器。
值得注意的是, Hibernate3.0的查詢翻譯器存在一個Bug:不支持某些theta-style連結查詢方言:如Oracle8i的OracleDialect 方言、Sybase11Dialect。解決這一問題的辦法有兩種:(1)改為使用支持ANSI-style連結查詢的方言,如 Oracle9Dialect,(2)如果升級的時候遇到這一問題,那么還是改為使用Hibernate2.1的查詢翻譯器。

1)indices()和elements()函數

在HQL 的select子句中廢棄了indices()和elements()函數,因為這兩個函數的語法很讓用戶費解,可以用顯式的連接查詢語句來替代 select elements(...) 。而在HQL的where子句中,仍然可以使用elements()函數。

【編輯推薦】

  1. 簡述Hibernate中加載并存儲對象
  2. Hibernate傳播性持久化攻略
  3. 深入了解Hibernate自動狀態檢測
  4. 教你如何在Hibernate中實例化集合和代理
  5. Hinerbate單端關聯代理頗析
責任編輯:仲衡 來源: 51cto.com
相關推薦

2009-06-17 09:34:31

Hibernate3Hibernate2連接池

2017-03-14 15:46:30

AndroidiOS不同之處

2021-03-09 16:38:48

加密貨幣比特幣貨幣

2021-11-14 22:06:48

JavaPython方式

2023-08-10 17:23:10

LibreOfficOpenOffice

2010-04-26 17:24:56

Unix操作系統

2012-08-23 13:36:27

2012-08-31 11:21:12

云計算大數據

2009-12-15 18:47:56

Ruby框架OG

2010-01-08 14:35:24

VB.NET模塊

2009-08-20 10:39:00

Java與C#的不同之

2010-04-20 16:07:25

Oracle DRCP

2010-05-24 18:49:13

MySQL數據庫

2013-03-11 10:15:25

路由器設備IP地址DHCP

2010-08-05 11:08:27

DB2存儲過程

2010-08-11 09:30:53

DB2常用函數

2010-02-04 09:26:23

C++模板函數重載

2010-04-08 11:11:16

Oracle查詢

2010-05-06 10:09:44

Oracle in

2010-09-27 10:43:35

無線路由器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成年免费大片黄在线观看岛国 | 国产一区二区高清在线 | 日韩精品一区二区三区免费视频 | 久久99深爱久久99精品 | 亚洲国产成人av好男人在线观看 | 亚洲精品1区 | 亚洲日本欧美日韩高观看 | 在线播放亚洲 | 精品一区二区av | av一级久久 | 日韩毛片| 国产亚洲精品久久19p | 日日操夜夜操视频 | 亚洲一区二区三区在线视频 | 一级片免费视频 | 亚洲成人免费电影 | 国产欧美日韩一区 | 中文字幕一区二区三区乱码图片 | 免费在线一区二区三区 | 美女中文字幕视频 | 国产免费a视频 | 亚洲国产精品久久 | 欧美在线二区 | 亚洲一区不卡 | 国产免费视频 | 激情 亚洲 | 在线观看av网站 | 久久精品a | 国产成在线观看免费视频 | 电影午夜精品一区二区三区 | 在线婷婷| 中国美女撒尿txxxxx视频 | 国产精品成人一区二区三区 | 亚洲网站在线观看 | 日韩精品视频在线观看一区二区三区 | 久久国产精品-国产精品 | 麻豆视频国产在线观看 | 日韩高清一区二区 | 欧美激情精品久久久久久变态 | 久草视频网站 | 国产精品久久久久久久久久不蜜臀 |