关于将Hibernate2升级为Hibernate3的基本步骤说明

    技术2024-12-25  15

    第一步:换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(); }

    最新回复(0)