Hibernate学习笔记---spring2.0+hibernate3.0

因为最近做项目需要用到LUCENE,而HIBERNATE+LUCENE好象只在HIBERNATE3.0支持,所以在项目中需要把spring 1.x+hibernate2.0升级到spring2.0+hibernate3.0.

1)下载 spring2.0,和hibernate3.0.的包

2)修改代码

代码需要修改的地方:/

1)包名不同

Hibernate3.0的包的根路径为: “org.hibernate” ,而在Hibernate2.1中为“net.sf.hibernate”。这一命名变化使得Hibernate2.1和Hibernate3.0能够同时在同一个应用程序中运行。

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

2)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();

3)配置文件不同,从数据库文件可以看出来(以红色标出来):

org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       
           
       

       
           
                tixa/logistics/model/DomainUserinfo.hbm.xml
                tixa/logistics/model/DomainName.hbm.xml
                tixa/logistics/model/DomainService.hbm.xml
                tixa/logistics/model/KeyWords.hbm.xml
                tixa/logistics/model/ApplyKeyWords.hbm.xml
           

       

       
           
                org.hibernate.dialect.MySQLDialect
                true
                update
           

       

   

 

 

以下是通过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)提示DTD错误:

对象-关系映射文件中的DTD文档,由原来的:
http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd
改为:http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd

2)org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed.

延迟加载机制不仅仅是在与其它表进行关联的时候才会用到的.在Hibernate3.0里.默认的lazy为true,使用代理模式proxy属性允许延迟加载类的持久化实例。调用session.load()方法,Hibernate开始会返回CGLIB代理,除主键外的其他值均为null。当代理的某个方法被实际调用的时候, 真实的持久化对象才会被装载,但必须在同一个session中。如session.close()前一直未调用方法,close()后再调用,会报:org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed.

使用Spring 封装的HibernateTemplate 操作,因为底层仍然是使用的Hibernate,所以这种现象是依然存在的.

在class标记出加个lazy=false即可。可以采取另一简单的升级方式:在元素中设置: default-lazy=“false”。 (后一种还没试验)

3)java.lang.NoClassDefFoundError: antlr/ANTLRException

这个是缺少包 :antlr-2.7.6.jar

4)java.lang.NoSuchMethodError: net.sf.cglib.proxy.Enhancer.setInterceptDuringConstruction

有个包是要更新的:cglib-nodep-2.1_3.jar 原来在SPRING中是 cglib-full-2.0.1.jar

5)count(*) 得到的类型不同了(没做过多的验证,如果出现了错误,可以从这思考)

hql="select count(*) from ....."

 List list = getHibernateTemplate().find(hql);
            if (list.size() < 1) {
                return 0;
            }

                       Long integer = (Long) list.get(0);//hiberter 3.0

                  //   Integer integer = (Integer) list.get(0);//hiberter 3.0

            return integer.intValue();

 

你可能感兴趣的:(Hibernate学习笔记---spring2.0+hibernate3.0)