- 浏览: 1509040 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (798)
- struts2 (42)
- servlet (20)
- quartz (4)
- jquery & ajax (24)
- tomcat (5)
- javascript (15)
- struts1 (8)
- 搜索关键字及链接 (3)
- fckeditor (3)
- Apache (5)
- spring (22)
- linux (3)
- 企业应用 (8)
- 综合应用 (13)
- 服务器 (2)
- 数据库 (85)
- 性能调优 (21)
- 网络应用 (15)
- 缓存技术 (8)
- 设计模式 (39)
- 面试题 (7)
- 程序人生&前辈程序员 (29)
- java基础 (59)
- hibernate (75)
- log4j (4)
- http (11)
- 架构设计 (28)
- 网页设计 (12)
- java邮件 (4)
- 相关工具 (11)
- ognl (7)
- 工作笔记 (18)
- 知识面扩展 (12)
- oracle异常 (1)
- 正则表达式 (2)
- java异常 (5)
- 项目实践&管理 (1)
- 专业术语 (11)
- 网站参考 (1)
- 论坛话题 (2)
- web应用 (11)
- cxf&webservice (22)
- freemarker (3)
- 开源项目 (9)
- eos (1)
- ibatis (6)
- 自定义标签 (3)
- jsp (3)
- 内部非公开文档(注意:保存为草稿) (0)
- 国内外知名企业 (2)
- 网店 (3)
- 分页 (1)
- 消费者习惯 (2)
- 每日关注 (1)
- 商业信息 (18)
- 关注商业网站 (1)
- 生活常识 (3)
- 新闻 (2)
- xml&JSON (5)
- solaris (1)
- apache.common (3)
- BLOB/CLOB (1)
- lucene (2)
- JMS (14)
- 社会进程 (8)
- SSH扩展 (2)
- 消费心理 (1)
- 珠三角 (1)
- 设计文档 (1)
- XWork&webwork (1)
- 软件工程 (3)
- 数据库及链接 (1)
- RMI (2)
- 国内外知名企业&人物 (1)
最新评论
-
司c马:
简介易懂、
OutputStream和InputStream的区别 -
在世界的中心呼喚愛:
解决我的问题
Java获取客户端的真实IP地址 -
bo_hai:
都是些基本的概念呀!
SSO -
tian_4238:
哥们,你也是搞水利这块的吧。
巧用SQLQuery中的addScalar -
loveEVERYday:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结
-
Hibernate批量更新是指在一个事务中更新大批量数据,Hibernate批量删除是指在一个事务中删除大批量数据。以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段:
本文向大家介绍Hibernate批量更新和Hibernate批量删除,可能好多人还不了解Hibernate批量更新和Hibernate批量删除,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。
Hibernate批量更新是指在一个事务中更新大批量数据,Hibernate批量删除是指在一个事务中删除大批量数据。以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段:
- tx = session.beginTransaction();
- Iterator customers=session.find("from Customer c where c.age>0").iterator();
- while(customers.hasNext()){
- Customer customer=(Customer)customers.next();
- customer.setAge(customer.getAge()+1);
- }
- tx.commit();
- session.close();
如果CUSTOMERS表中有1万条年龄大于零的记
如果CUSTOMERS表中有1万条年龄大于零的记录,那么Session的find()方法会一下子加载1万个Customer对象到内存。当执行tx.commit()方法时,会清理缓存,Hibernate执行1万条更新CUSTOMERS表的update语句:
-
- update CUSTOMERS set AGE=? …. where ID=i;
- update CUSTOMERS set AGE=? …. where ID=j;
- update CUSTOMERS set AGE=? …. where ID=k;
以上Hibernate批量更新方式有两个缺点:
(1) 占用大量内存,必须把1万个Customer对象先加载到内存,然后一一更新它们。
(2) 执行的update语句的数目太多,每个update语句只能更新一个Customer对象,必须通过1万条update语句才能更新一万个Customer对象,频繁的访问数据库,会大大降低应用的性能。
为了迅速释放1万个Customer对象占用的内存,可以在更新每个Customer对象后,就调用Session的evict()方法立即释放它的内存:
- tx = session.beginTransaction();
- Iterator customers=session.find("from Customer c where c.age>0").iterator();
- while(customers.hasNext()){
- Customer customer=(Customer)customers.next();
- customer.setAge(customer.getAge()+1);
- session.flush();
- session.evict(customer);
- }
- tx.commit();
- session.close();
在以上程序中,修改了一个Customer对象的age属性后,就立即调用Session的flush()方法和evict()方法,flush()方法使Hibernate立刻根据这个Customer对象的状态变化同步更新数据库,从而立即执行相关的update语句;evict()方法用于把这个Customer对象从缓存中清除出去,从而及时释放它占用的内存。
但evict()方法只能稍微提高批量操作的性能,因为不管有没有使用evict()方法,Hibernate都必须执行1万条update语句,才能更新1万个Customer对象,这是影响批量操作性能的重要因素。假如Hibernate能直接执行如下SQL语句:
- update CUSTOMERS set AGEAGE=AGE+1 where AGE>0;
那么以上一条update语句就能更新CUSTOMERS表中的1万条记录。但是Hibernate并没有直接提供执行这种update语句的接口。应用程序必须绕过Hibernate API,直接通过JDBC API来执行该SQL语句:
- tx = session.beginTransaction();
- Connection con=session.connection();
- PreparedStatement stmt=con.prepareStatement("update CUSTOMERS set AGEAGE=AGE+1 "
- +"where AGE>0 ");
- stmt.executeUpdate();
- tx.commit();
以上程序演示了绕过Hibernate API,直接通过JDBC API访问数据库的过程。应用程序通过Session的connection()方法获得该Session使用的数据库连接,然后通过它创建PreparedStatement对象并执行SQL语句。值得注意的是,应用程序仍然通过Hibernate的Transaction接口来声明事务边界。
如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行Hibernate批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateCustomer()的存储过程,代码如下:
-
- create or replace procedure batchUpdateCustomer(p_age in number) as
- begin
- update CUSTOMERS set AGEAGE=AGE+1 where AGE>p_age;
- end;
以上存储过程有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:
- tx = session.beginTransaction();
- Connection con=session.connection();
- String procedure = "{call batchUpdateCustomer(?) }";
- CallableStatement cstmt = con.prepareCall(procedure);
- cstmt.setInt(1,0); //把年龄参数设为0
- cstmt.executeUpdate();
- tx.commit();
从上面程序看出,应用程序也必须绕过Hibernate API,直接通过JDBC API来调用存储过程。
Session的各种重载形式的update()方法都一次只能更新一个对象,而delete()方法的有些重载形式允许以HQL语句作为参数,例如:
- session.delete("from Customer c where c.age>0");
如果CUSTOMERS表中有1万条年龄大于零的记录,那么以上代码能删除一万条记录。但是Session的delete()方法并没有执行以下delete语句
- delete from CUSTOMERS where AGE>0;
Session的delete()方法先通过以下select语句把1万个Customer对象加载到内存中:
- select * from CUSTOMERS where AGE>0;
接下来执行一万条delete语句,逐个删除Customer对象:
- delete from CUSTOMERS where ID=i;
- delete from CUSTOMERS where ID=j;
- delete from CUSTOMERS where ID=k;
由此可见,直接通过Hibernate API进行Hibernate批量更新和Hibernate批量删除都不值得推荐。而直接通过JDBC API执行相关的SQL语句或调用相关的存储过程,是Hibernate批量更新和Hibernate批量删除的最佳方式,这两种方式都有以下优点:
(1) 无需把数据库中的大批量数据先加载到内存中,然后逐个更新或修改它们,因此不会消耗大量内存。
(2) 能在一条SQL语句中更新或删除大批量的数据。
发表评论
-
自定义用户类(UserType)的使用
2011-08-04 10:46 1881学习hibernate有段时间了,最近复习这门技术时看到了自定 ... -
技巧:利于ThreadLocal模式管理Session
2011-08-02 10:31 1271在利用Hibernate开发DAO模块时,我们和Session ... -
Hibernate中的回调与拦截机制
2011-07-27 17:31 1466在某些情况下,我们需要对实体的CURD操作进行捕获并执行一些操 ... -
HibernateTemplate中HibernateCallback的事务
2011-07-04 14:41 1455目的:使用HibernateTemplate执行execute ... -
Hibernate的复杂用法HibernateCallback
2011-07-04 14:40 1345HibernateTemplate还提供一种更加灵活的方式来操 ... -
Hibernate session FlushMode有五种属性
2011-07-04 13:59 17371、NEVER:已经废弃了,被MANUAL取代了2 MANUA ... -
数据库持久层——浅谈hibernate中的Session
2011-07-01 22:49 1680大多数情况下,Session 管理的目标聚焦于通过合理的设 ... -
详解Hibernate Session
2011-07-01 22:42 1503这里介绍Hibernate Session,Ses ... -
HttpSession与Hibernate中Session的区别
2011-07-01 22:41 1304一、javax.servlet.http.HttpSess ... -
巧用SQLQuery中的addScalar
2011-06-02 17:16 5756当我们用HQL进行子查询的时候,如select * from ... -
hibernate中SQLQuery的addEntity();方法
2011-04-13 14:48 2898如果使用原生sql语句进行query查询时,hibernate ... -
Hibernate的clear(),flush(),evict()方法详解
2011-03-24 11:18 17781.Clear 方法 无论是Load 还是 G ... -
hibernate模糊查询-Restrictions.ilike & Expression.like
2011-03-11 10:32 16369Criteria criteria = session.c ... -
Hibernate分页查询小结
2011-03-10 11:14 1834通常使用的Hibernate通常是三种:hql查询,QBC查询 ... -
current_session_context_class
2011-03-07 15:31 1300此设置的作用如下: What does sessionFac ... -
Hibernate的拦截器和监听器
2010-12-14 15:06 1392核心提示:最近项目需要,用到了Hibernate的拦截器和 ... -
孙卫琴.精通Hibernate:Java对象持久化技术详解_触发器使缓存与数据库不一致
2010-12-14 08:46 1404p198 -
孙卫琴.精通Hibernate:Java对象持久化技术详解_优化报表查询的性能
2010-12-13 17:51 1281p332 -
孙卫琴.精通Hibernate:Java对象持久化技术详解_查询结果类型
2010-12-13 17:34 1309p329 -
孙卫琴.精通Hibernate:Java对象持久化技术详解_投影查询
2010-12-13 17:31 1430p325
相关推荐
6. **高级特性**:除了基础功能之外,本书还涵盖了诸如懒加载、批量更新和删除等高级特性。 #### 三、书籍特点分析 1. **权威性**:作为由Hibernate项目的创始人和核心贡献者撰写的书籍,《Hibernate实战》在内容...
2. **批量更新/删除**:对于大量数据的操作,建议使用批量更新或批量删除以提高效率。 3. **缓存策略**:合理设置缓存策略,利用Hibernate的一级缓存和二级缓存机制。 4. **事务管理**:确保所有的数据库操作都在...
但是,考虑到标题和描述中提到的“hibernate实战 第2版.pdf”,我们可以基于这个信息来生成关于Hibernate的知识点。以下是根据这一主题撰写的详细知识点: Hibernate是一个开放源代码的对象关系映射(ORM)框架,...
第一部分 从Hibernate和EJB 3.0开始 第1章 理解对象/关系持久化 1.1 什么是持久化 1.1.1 关系数据库 1.1.2 理解SQL 1.1.3 在Java中使用SQL 1.1.4 面向对象应用程序中的持久化 1.2 范式不...
3. Session和Transaction管理:阐述了Hibernate的核心接口Session的使用,包括打开、关闭、保存、更新、删除对象的方法。同时,讲解了事务(Transaction)管理的基础知识,如何确保数据操作的原子性、一致性、隔离性...
9. 批量操作:为了提高性能,Hibernate支持批量插入、更新和删除,以及批处理查询。 10. JPA集成:Hibernate也实现了Java Persistence API(JPA),提供了一种标准的方式来使用ORM服务。 通过"MLDN_Hibernate开发...
在Java企业级应用开发中,Spring和Hibernate是两个非常重要的框架。Spring是一个全面的后端应用框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,而Hibernate则是一个强大的ORM(对象...
5. 数据库操作:使用Hibernate进行CRUD(Create、Read、Update、Delete)操作,包括持久化对象、加载和更新对象、删除对象以及查询对象。例如,Session的save()和update()方法用于保存和更新对象,get()和load()用于...
1. **批处理**: 使用batch_size属性批量处理插入和更新,减少数据库交互次数。 2. **延迟加载**: 对于不立即使用的关联对象,使用懒加载以节省资源。 3. **缓存策略**: 合理使用二级缓存和查询缓存,减少数据库访问...
12. **批处理**:Hibernate支持批处理操作,如批量插入、更新,可以显著提高数据处理效率。 以上知识点涵盖了使用jar运行的Hibernate实战中可能涉及的主要内容。在实际的source_code中,我们可以看到如何通过Java...
这个“hibernateSearch+demo”项目提供了一个实战示例,帮助开发者理解并应用 Hibernate Search 的核心概念和功能。 在 Hibernate Search 中,主要涉及以下关键知识点: 1. **全文索引**:Hibernate Search 使用 ...
批量处理部分将指导读者如何高效地执行大数据量的操作,如批处理插入、更新和删除,以及如何利用Hibernate的Criteria API和HQL(Hibernate Query Language)来编写更高效的查询。 对象事件部分则涉及对象生命周期的...
2. Session:作为与数据库交互的主要接口,Session负责对象的持久化操作,如保存、更新、删除等。 3. Query:提供HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)来执行数据库查询,也...
Hibernate支持一对一、一对多、多对一和多对多四种关联关系的映射,包括单向和双向关联,以及懒加载和立即加载策略。 十、性能优化 为了提高性能,可以采用批处理、延迟加载、缓存策略等手段。比如,使用BatchSize...
1. 自动化实体管理:通过注解或XML配置,自动管理实体对象的生命周期,包括实例化、持久化、加载和更新。 2. 批量操作支持:提供批量插入、更新和删除的API,减少数据库操作的开销。 3. 动态查询:允许开发者根据...
Hibernate 3.0是Hibernate系列的一个重要版本,它在2.0的基础上进行了大量改进,增强了性能和稳定性,引入了更多的新特性。这个版本引入了对JPA(Java Persistence API)的支持,提供了更强的查询语言HQL(Hibernate...
1. **批处理**:批量插入、更新和删除,减少数据库交互次数。 2. **缓存配置**:合理设置缓存策略,避免频繁的数据库访问。 3. **查询优化**:避免N+1查询,减少JOIN操作,利用索引等。 **十、实战应用** 在实际...