Hibernate 批量更新数据

来源:互联网 发布:文明5mac汉化补丁 编辑:程序博客网 时间:2024/05/21 21:41

进行批量更新时,如果一下子把所有对象加载到session的缓存中,然后再进缓存中一一更新它们,显然是不可取的,为了解决这一问题,可以使用滚动的结果集

org.hibernate.ScrollableResults,Query的 scroll()方法返回一个ScrollableResults对象。以下是示例,该代码一开始利用ScrollableResults对象来家在所有的Customer

</pre><p><pre name="code" class="java">

对象


Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

ScrollableResults customers = session.createQuery("from Customer").scroll(ScrollMode.FORWARD_ONLY);

int count = 0;

while(customers.next()){

Customer customer = (Customer)customers.get(0);

customer.setAge(customer.getAge()+1);

if(++count%20==0){ //单次操作数目为20条

session.flush(); //清理缓存,执行批量更新20条记录的SQL update语句

session.clear();//清空缓存中的Customer对象

}

}

tx.commit();

session.close();

</pre>在以上代码中,Query的scroll()方法返回的ScrollableResults对象中实际上并不包括任何Customer对象,它仅包含用于在线定位数据库中CUSTOMERS记录的游标。</p><p>只有当程序遍历访问ScrollableResults对象中的特定元素时,它才会到数据库中加载相应的Customer对象。</p><p>为了保证以上程序顺利运行,需要遵守一下约束:</p><p>1.在Hibernate的配置文件中,应该把hibernate.jdbc.batch_size属性也设为20。</p><p>2.关闭第二级缓存,假如已经在配置文件中启用了第二级缓存,也可以通过以下方式在程序中hulve第二级缓存:</p><p><pre name="code" class="java">

ScrollableResults customers = session.createQuery("from Customer").setCacheMode(CacheMode.IGNORE).scroll(ScrollMode.FORWORD_ONLY);



0 0
原创粉丝点击