1.1 Hibernate API 變化 1.1.1 包名 1.1.2 org.hibernate.classic包 1.1.3 Hibernate所依賴的第三方軟件包 1.1.4 異常模型 1.1.5 Session接口 1.1.6 createSQLQuery() 1.1.7 Lifecycle 和 Validatable 接口 1.1.8 Interceptor接口 1.1.9 UserType和CompositeUserType接口 1.1.10 FetchMode類 1.1.11 PersistentEnum類 1.1.12 對Blob 和Clob的支持 1.1.13 Hibernate中供擴展的API的變化 1.2 元數據的變化 1.2.1 檢索策略 1.2.2 對象標識符的映射 1.2.3 集合映射 1.2.4 DTD 1.3 查詢語句的變化 1.3.1 indices()和elements()函數 盡管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.1 Hibernate API 變化 1.1.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。 1.1.2 org.hibernate.classic包 Hibernate3.0把一些被廢棄的接口都轉移到org.hibernate.classic中。 1.1.3 Hibernate所依賴的第三方軟件包 在Hibernate3.0的軟件包的lib目錄下的README.txt文件中,描述了Hibernate3.0所依賴的第三方軟件包的變化。 1.1.4 異常模型 在Hibernate3.0中,HibernateException異常以及它的所有子類都繼承了java.lang.RuntimeException。因此在編譯時,編譯器不會再檢查HibernateException。 1.1.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執行批量更新的程序代碼: Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlUpdate = "update Customer set name = :newName where name = :oldName"; int updatedEntities = s.createQuery( hqlUpdate ) .setString( "newName", newName ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close(); 以下是通過Hibernate3.0執行批量刪除的程序代碼: Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlDelete = "delete Customer where name = :oldName"; int deletedEntities = s.createQuery( hqlDelete ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close(); 1.1.6 createSQLQuery() 在Hibernate3.0中,Session接口的createSQLQuery()方法被廢棄,被移到org.hibernate.classic.Session接口中。Hibernate3.0采用新的SQLQuery接口來完成相同的功能。 1.1.7 Lifecycle 和 Validatable 接口 Lifecycle和Validatable 接口被廢棄,并且被移到org.hibernate.classic包中。 1.1.8 Interceptor接口 在Interceptor 接口中加入了兩個新的方法。 用戶創建的Interceptor實現類在升級的過程中,需要為這兩個新方法提供方法體為空的實現。此外,instantiate()方法的參數作了修改,isUnsaved()方法被改名為isTransient()。 1.1.9 UserType和CompositeUserType接口 在UserType和CompositeUserType接口中都加入了一些新的方法,這兩個接口被移到org.hibernate.usertype包中,用戶定義的UserType和CompositeUserType實現類必須實現這些新方法。 Hibernate3.0提供了ParameterizedType接口,用于更好的重用用戶自定義的類型。 1.1.10 FetchMode類 FetchMode.LAZY 和 FetchMode.EAGER被廢棄。取而代之的分別為FetchMode.SELECT 和FetchMode.JOIN。 1.1.11 PersistentEnum類 PersistentEnum被廢棄并刪除。已經存在的應用應該采用UserType來處理枚舉類型。 1.1.12 對Blob 和Clob的支持 Hibernate對Blob和Clob實例進行了包裝,使得那些擁有Blob或Clob類型的屬性的類的實例可以被游離、序列化或反序列化,以及傳遞到merge()方法中。 1.1.13 Hibernate中供擴展的API的變化 org.hibernate.criterion、
廣告一下 我的新站: BT下載