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
分享到:
相关推荐
在Java开发领域,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者能够更加专注于..."hibernate_cache_level_1.rar"文件提供了一个实战平台,帮助开发者深入了解和实践Hibernate的一级缓存机制。
在深入了解Hibernate `EntityManager` 的使用之前,我们首先需要理解Hibernate的整体架构及其核心概念。 - **定义**:Hibernate 是一个开源的对象关系映射(ORM)框架,用于将Java对象映射到关系数据库中的表。`...
3. 实体映射:了解如何使用Hibernate的XML映射文件(hbm.xml)或注解来定义Java类与数据库表之间的映射关系,包括基本类型、复合类型、集合类型和关联映射。 4. Session API:掌握Session接口的基本操作,如保存、...
`Session.flush()`的实现涉及到对持久化对象的跟踪、脏检查算法以及与JDBC连接的交互,这些都是深入学习Hibernate时的重要内容。 总结来说,`Session.flush()`是Hibernate中不可或缺的一部分,它确保了数据库与应用...
通过对Hibernate源码的深入学习,我们可以了解其内部机制,如对象的状态管理、查询优化、缓存策略等,这有助于我们编写更高效、更健壮的代码。同时,这也为我们理解和使用其他ORM框架,甚至自定义ORM解决方案奠定了...
在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...
《深入浅出Hibernate》这本书是Java开发者深入了解和学习Hibernate框架的重要参考资料。Hibernate作为一个开源的对象关系映射(ORM)框架,极大地简化了Java应用程序对数据库的操作,使得开发人员能够以面向对象的...
3. **Flush模式**: Hibernate有四种Flush模式:AUTO、COMMIT、MANUAL和NEVER。在大数据批处理中,一般使用MANUAL或COMMIT模式,以控制何时将脏数据刷新到数据库,避免频繁的自动刷新影响性能。 4. **Query....
本文将深入探讨Hibernate中的事务处理机制,并通过具体示例帮助读者更好地理解和运用。 #### 二、Hibernate事务处理基础 ##### 2.1 事务概念 在数据库操作中,事务是指一系列操作作为一个完整的单元来执行。这些...
通过观看提供的开发视频和阅读源码,你可以深入理解Hibernate的内部工作原理,了解如何配置、使用和优化它。而开发文档则会提供详细的API参考和使用示例,帮助你解决实际开发中的问题。 总之,Hibernate框架为Java...
2. **缓存与数据库的同步**:当我们调用`Session.flush()`方法时,Hibernate会将一级缓存中所有更改过的对象同步到数据库,确保数据的一致性。而在事务提交(`Transaction.commit()`)时,Hibernate会自动执行flush...
《深入探索Hibernate 3.6源码:核心与实践》 Hibernate 3.6作为一款广泛应用的Java对象关系映射(ORM)框架,其源代码是开发者深入理解ORM机制、优化数据库操作的重要参考资料。该源码包“hibernate-core-3.6.0....
了解Hibernate的基本架构,包括SessionFactory、Session、Transaction等核心组件,是深入源码分析的基础。 2. **Entity和Mapping**:在Hibernate中,实体(Entity)是Java对象,代表数据库中的记录。XML或注解方式...
总的来说,Hibernate中文参考手册是开发者深入理解并有效利用Hibernate的关键。通过这个文档,你可以全面了解Hibernate的各种功能,并学会如何在实际项目中灵活运用,提升开发效率。无论是初学者还是经验丰富的...
《Hibernate开发实战讲解》是一本深入探讨Java领域持久化框架Hibernate的教程,它结合实际案例,为开发者提供了详尽的源代码分析,旨在帮助读者掌握Hibernate的核心技术和实践应用。在这个压缩包中,我们期待找到一...
这个源码包提供了深入理解Hibernate工作原理的机会,这对于任何想要优化其ORM实现或者希望进行自定义扩展的开发者来说都极其宝贵。 1. **Hibernate ORM概念** Hibernate的核心概念包括实体(Entity)、持久化类...
本篇将深入探讨Hibernate的核心概念,以及如何通过提供的源码进行学习与实践。 1. Hibernate概述 Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式处理数据库操作。通过...