`
wuhaidong
  • 浏览: 360246 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

hibernate_flush 深入了解

阅读更多

session flush方法主要做了两件事:

* 清理缓存

* 执行sql语句

session 在什么情况下执行flush

*默认在事务提交时

*显示的调用flush

*在执行查询前,如:iterate

 

 

 

public void save(){
		Session session=null;
		Transaction tr=null;
		try{
			session=HibernateUtil.getSession();
			tr=session.beginTransaction();
			
			Client client=new Client();
			client.setUserName("吴海东");
			client.setUserPass("1111");
			client.setCreateDate(new Date());
			
			//因为client的主键生成策略采用的是uuid,所以调用完成save后,只是将client纳入到了session管理
			//不会发出insert语句,但是id已经生成了,session中existsInDatebase状态为false
			session.save(client);
			//调用flush,hibernate会清理缓存,执行sql,
			//如果数据库的隔离级别设置为未提交读,那么我们可以看到flush过的数据
			//并且session中existsInDatebase状态为true
			session.flush();
			//提交事务
			//默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush
			//commit后数据时无法回滚的
			tr.commit();
		}catch(Exception e){
			e.printStackTrace();
			tr.rollback();
			throw new RuntimeException();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}

 

 

 

 

 

public void save1(){
		Session session=null;
		Transaction tr=null;
		try{
			session=HibernateUtil.getSession();
			tr=session.beginTransaction();
			
			Client client=new Client();
			client.setUserName("BBB");
			client.setUserPass("1111");
			client.setCreateDate(new Date());
			
			//因为client的主键生成策略为native,所以调用session.save后,执行insert语句,返回有数据库生成的Id
			//纳入session的管理,修改了session中existsInDatebase状态为true
			//如果数据库的隔离级别设置为未提交读,那么我们可以看到save过的数据
			session.save(client);
			tr.commit();
		}catch(Exception e){
			e.printStackTrace();
			tr.rollback();
			throw new RuntimeException();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}

 

 

 

 

 

public void save2(){
		Session session=null;
		Transaction tr=null;
		try{
			session=HibernateUtil.getSession();
			tr=session.beginTransaction();
			
			Client client=new Client();
			client.setUserName("CCC");
			client.setUserPass("1111");
			client.setCreateDate(new Date());
			
			//因为client的主键生成策略采用的是uuid,所以调用完成save后,只是将client纳入到了session管理
			//不会发出insert语句,但是id已经生成了,session中existsInDatebase状态为false
			session.save(client);
			
			//将client对象从session中逐出,即sessiond的EntiryEntries属性中逐出
			session.evict(client);
			//无法成功提交,因为hibernate在清理缓存时,在session的insertions集合中取出client对象进行insert语句
			//需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将client从session中逐出
			//所以找不到相关数据,无法更新,抛出异常
			tr.commit();
		}catch(Exception e){
			e.printStackTrace();
			tr.rollback();
			throw new RuntimeException();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}

 

save2()方法中的错误的解决方法!

在eviet()方法之前执行先执行flush()方法

flush():flush后hibernate会清理缓存,会将client对象保存到数据库中,将session中的insertions中的client清除,并且设置session中existsInDatabase的状态为true

分享到:
评论
1 楼 iszhao 2011-12-02  
复习巩固一下

相关推荐

    hibernate_cache_level_1.rar_alreadydcc_java

    在Java开发领域,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者能够更加专注于..."hibernate_cache_level_1.rar"文件提供了一个实战平台,帮助开发者深入了解和实践Hibernate的一级缓存机制。

    hibernate_reference_entityManager 3.5.0_final pdf

    在深入了解Hibernate `EntityManager` 的使用之前,我们首先需要理解Hibernate的整体架构及其核心概念。 - **定义**:Hibernate 是一个开源的对象关系映射(ORM)框架,用于将Java对象映射到关系数据库中的表。`...

    hibernate_reference 3.12

    3. 实体映射:了解如何使用Hibernate的XML映射文件(hbm.xml)或注解来定义Java类与数据库表之间的映射关系,包括基本类型、复合类型、集合类型和关联映射。 4. Session API:掌握Session接口的基本操作,如保存、...

    hibernate的session.flush

    `Session.flush()`的实现涉及到对持久化对象的跟踪、脏检查算法以及与JDBC连接的交互,这些都是深入学习Hibernate时的重要内容。 总结来说,`Session.flush()`是Hibernate中不可或缺的一部分,它确保了数据库与应用...

    hibernate_src

    通过对Hibernate源码的深入学习,我们可以了解其内部机制,如对象的状态管理、查询优化、缓存策略等,这有助于我们编写更高效、更健壮的代码。同时,这也为我们理解和使用其他ORM框架,甚至自定义ORM解决方案奠定了...

    Hibernate的事务处理机制和flush方法的用法.docx

    在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...

    深入浅出Hibernate

    《深入浅出Hibernate》这本书是Java开发者深入了解和学习Hibernate框架的重要参考资料。Hibernate作为一个开源的对象关系映射(ORM)框架,极大地简化了Java应用程序对数据库的操作,使得开发人员能够以面向对象的...

    关于hibernate的批处理

    3. **Flush模式**: Hibernate有四种Flush模式:AUTO、COMMIT、MANUAL和NEVER。在大数据批处理中,一般使用MANUAL或COMMIT模式,以控制何时将脏数据刷新到数据库,避免频繁的自动刷新影响性能。 4. **Query....

    详解Hibernate事务处理机制

    本文将深入探讨Hibernate中的事务处理机制,并通过具体示例帮助读者更好地理解和运用。 #### 二、Hibernate事务处理基础 ##### 2.1 事务概念 在数据库操作中,事务是指一系列操作作为一个完整的单元来执行。这些...

    Hibernate框架

    通过观看提供的开发视频和阅读源码,你可以深入理解Hibernate的内部工作原理,了解如何配置、使用和优化它。而开发文档则会提供详细的API参考和使用示例,帮助你解决实际开发中的问题。 总之,Hibernate框架为Java...

    hibernate一级缓存

    2. **缓存与数据库的同步**:当我们调用`Session.flush()`方法时,Hibernate会将一级缓存中所有更改过的对象同步到数据库,确保数据的一致性。而在事务提交(`Transaction.commit()`)时,Hibernate会自动执行flush...

    Hibernate 3.6 Final Source Code

    《深入探索Hibernate 3.6源码:核心与实践》 Hibernate 3.6作为一款广泛应用的Java对象关系映射(ORM)框架,其源代码是开发者深入理解ORM机制、优化数据库操作的重要参考资料。该源码包“hibernate-core-3.6.0....

    精通Hibernate源码

    了解Hibernate的基本架构,包括SessionFactory、Session、Transaction等核心组件,是深入源码分析的基础。 2. **Entity和Mapping**:在Hibernate中,实体(Entity)是Java对象,代表数据库中的记录。XML或注解方式...

    Hibernate官方中文参考手册下载

    总的来说,Hibernate中文参考手册是开发者深入理解并有效利用Hibernate的关键。通过这个文档,你可以全面了解Hibernate的各种功能,并学会如何在实际项目中灵活运用,提升开发效率。无论是初学者还是经验丰富的...

    Hibernate开发实战讲解(源代码)

    《Hibernate开发实战讲解》是一本深入探讨Java领域持久化框架Hibernate的教程,它结合实际案例,为开发者提供了详尽的源代码分析,旨在帮助读者掌握Hibernate的核心技术和实践应用。在这个压缩包中,我们期待找到一...

    hibernate 3.3 源码

    这个源码包提供了深入理解Hibernate工作原理的机会,这对于任何想要优化其ORM实现或者希望进行自定义扩展的开发者来说都极其宝贵。 1. **Hibernate ORM概念** Hibernate的核心概念包括实体(Entity)、持久化类...

    Hibernate开发实战讲解(源代码)源码整理

    本篇将深入探讨Hibernate的核心概念,以及如何通过提供的源码进行学习与实践。 1. Hibernate概述 Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式处理数据库操作。通过...

Global site tag (gtag.js) - Google Analytics