Hibernate 3.0 原始碼不兼容 2.1,但設計時充分考慮升級便利性。現有專案可平滑遷移,且 3.0 與 2.1 允許同一應用程式並存運行。
遷移涉及三大面向:
net.sf.hibernate → org.hibernatenet.sf.hibernate.expression → org.hibernate.criterion升級首步:全專案替換 import 陳述式。外部庫(如 EHCache)若引用舊介面,需同步升級或改用 Hibernate 3.0 內建 org.hibernate.cache.EhCacheProvider。
舊介面移至 org.hibernate.classic,透過子介面相容。SessionFactory.openSession() 回傳 org.hibernate.classic.Session,含 find()、iterate()、delete(String hql)、saveOrUpdateCopy() 等廢棄方法。
完全遷移寫法:
org.hibernate.Session session = sessionFactory.openSession();
// 使用 createQuery() 統一查詢,DELETE 批次刪除,merge() 替代 saveOrUpdateCopy()
快速相容寫法:
org.hibernate.classic.Session session = sessionFactory.openSession();
// 繼續使用舊 API
2.1 需先載入物件至記憶體,3.0 直接執行 HQL 批次操作:
// 批次更新
String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updated = session.createQuery(hqlUpdate)
.setString("newName", newName)
.setString("oldName", oldName)
.executeUpdate();
// 批次刪除
String hqlDelete = "delete Customer where name = :oldName";
int deleted = session.createQuery(hqlDelete)
.setString("oldName", oldName)
.executeUpdate();
HibernateException 及所有子類別改繼承 RuntimeException,編譯器不再強制檢查,簡化錯誤處理程式碼。
移至 org.hibernate.classic.Session,3.0 採用新 SQLQuery 介面實現相同功能。
Lifecycle、Validatable 移至 org.hibernate.classicInterceptor 新增兩方法、instantiate() 參數變更、isUnsaved() 改名 isTransient()UserType/CompositeUserType 需實作新增方法,並移至 org.hibernate.usertypeParameterizedType 介面支援使用者自訂類型重用FetchMode.LAZY/EAGER 廢棄,改用 SELECT/JOINPersistentEnum 移除,改用 UserType 處理列舉merge() 傳遞org.hibernate.criterion、mapping、persister、collection 結構大幅重構。多數應用不受影響,若擴展相關類別需謹慎升級。
lazy 預設 falselazy 預設 true升級策略:映射檔 <set>、<class> 等元素顯式加 lazy="true",或於 <hibernate-mapping> 設 default-lazy="false" 保持舊行為。
unsaved-value 可選,預設 "0"Interceptor.isUnsaved(),3.0 自動查詢資料庫判斷狀態(效能稍遜,建議顯式實作)<index> 部分情況下由 <list-index> 取代<key-many-to-many> → <map-key-many-to-many><composite-index> → <composite-map-key><!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
3.0 採 ANTLR 新翻譯器,2.1 經典翻譯器保留。於 hibernate.cfg.xml 選擇:
<!-- 3.0 ANTLR 翻譯器 -->
hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory
<!-- 2.1 經典翻譯器 -->
hibernate.query.factory_class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory
不支援某些 theta-style 連結查詢方言(Oracle8i OracleDialect、Sybase11Dialect)。解決方案:
Oracle9Dialect)SELECT 子句廢棄兩函數,改用顯式連結查詢WHERE 子句仍可使用 elements()Hibernate 3.0 帶來批次操作、新翻譯器、改進異常模型等重大增強。遵循本指南逐步遷移:先替換套件名、再調整映射檔、最後驗證 HQL,並善用雙翻譯器並存特性平滑過渡。建議優先遷移核心模組,邊測試邊釋出。