读书人

施用Hibernate进行数据的批量更新

发布时间: 2012-09-07 10:38:15 作者: rapoo

使用Hibernate进行数据的批量更新
当我们使用SQL直接在数据库里面操作是,批量更新一大批数据是很快捷的,比如
update Companys set BidPrice='1000' where Name='MS'
不管有多少条Name='MS'的记录都会被更新,而且直接作用于数据至少比较快。
但是当我们使用Hibernate的时候,事情就有点变化了,当我们必须批处理如以上的数据时,假定有10000条,那么我们必须先Query(..).List出10000个Company对象,而这些对象会马上加载到Hibernate的第一级缓存中,也就是Session缓存,成为持久化对象(PO),
在更新他们的时候:

       String hqlStatement="update Company m set m.BiDPrice=:NewPrice where m.Name=:ComName";       int updatedEntities=session.createQuery(hqlStatement)           .setString("NewPrice","1000")           .setString("ComName","MS")           .executeUpdate();        tx.commit();        session.close();     

它不需要缓存,另外只生成一条SQL update语句,客户机内存和服务器的负载都很低,就和直接使用SQL一样,但是还是有些性能损失的,至少Hibernate必须根据方言把上面的HQL转换成能够执行的SQL,需要一定的CPU时间。但是这样少的损失是可以忍受的,毕竟就是一次计算的过程,即使二级缓存被打开,也不会产生什么副作用了。
但是也不并是说任何场合下使用HQL都很高效,比如取得一个Company对应的所有订单,如果用HQL就会马上为所有这些订单对象填充数据,如果用Company.getOrders()就会好的多,因为我们可以在hbm映射文件中将Company的lazy=true,这样就有了延迟加载的能力,也就是说,我们在调用Company,getOrders才开始加载数据,不用的时候不加载。
其实,批量更新,如果用Hibernate调用存储过程,就更加快捷,网络交通只是一存储过程的名称和参数,比写一个HQL更加简短有效!
1 楼 liangguanhui 2010-11-03 有一次去一个公司笔试的时候,有一道题目是关于HQL可以干啥,当时选了Query,后来才发现原来可以可以跟普通SQL一样DML。当然,一级缓存就失去了对这些对象的控制了。

读书人网 >软件架构设计

热点推荐