關於將Hibernate2升級爲Hibernate3的基本步驟說明


第一步:換jar包
即將hibernate2.1.jar包換成hibernate3.jar,這一步很簡單這裏就不具體說了。


第二步:修改Hibernate.cfg.xml文件

 

(由於項目有遺留的原因)這裏有部份模塊採用的是Struts+Hibernate框架的
即將hibernate.cfg.xml文件中的
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

改爲:

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

當然如果你是採用的hibernate.properties的方式那也是類似地做一些修改


第三步:修改xxx.hbm.xml文件
將<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
修改爲:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

 

第四步:修改java文件中的引入import
將所有程序中的net.sf.hibernate替換爲org.hibernate

但是有例外
net.sf.hibernate.expression.Expression換爲org.hibernate.criterion.Expression
如果用eclipse,用ctrl+shift+o快捷鍵可以加快速度

 

第五步:修改一些Hibernate3廢棄的方法
在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章的

(批量更新和批量刪除),而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();

 

獲取表名的方法 也需要改動

 

hibernate2中:

 ClassPersister classPersister = factoryImpl.getPersister(className);
        if (classPersister instanceof EntityPersister)
        {
             tableName = ((EntityPersister) classPersister).getTableName();
        }

 

hibernate3實現:

ClassMetadata hibernateMetadata = sessionFactory.getClassMetadata(pClassName); 
if (hibernateMetadata == null){ 
   
return; 
} 
if (hibernateMetadata instanceof AbstractEntityPersister)){ 
     
AbstractEntityPersister persister = (AbstractEntityPersister) hibernateMetadata; 
     
String tableName = persister.getTableName(); 
     
String[] columnNames = persister.getKeyColumnNames(); 
}

發佈了17 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章