针对昨天松哥遇到的hibernate的问题。算是hibernate最基本的东西。具了解,这个问题很多人遇到过,也很常见,却遇到了还经常会懵了。
为了加深印象,知其然,知其所以然。
之后单纯用原始的Hibernate框架做了一些验证,并且打开执行SQL打印输出台的,得出的结论:
前提是在同一事务中间:
1、利用sql语句, session.createSQLQuery(sql).executeUpdate();进行插入,输出台打印出sql插入语句; 再利用sql语句,进行session.createSQLQuery(sql).uniqueResult(); 也会打印SQL查询语句,没有问题,可以查询到数据。
2、利用hibernate封装操作, session.save(entity); 进行插入,输出台并没有打印出插入的SQL语句, 再利用 session.get(entity,id);方法做查询 ;也没有打印出SQL查询语句,但是是可以查询到数据的。到执行事务提交语句时,插入的SQL语句被打印出来
3、利用hibernate的session.save(entity); 进行插入,再利用《HQL》语句进行查询,效果同上面第二点。
4、利用hibernate的session.save(entity); 进行插入,输出台并没有打印出插入的SQL语句。 再利用sql语句,进行session.createSQLQuery(sql).uniqueResult(); 会打印SQL查询语句。问题出现了,查询不到任何数据。这种情况下利用session.flush()方法,在查询之前执行到flush()方法,输出台会打印出插入的SQL语句。 再进行查询就有数据。
验证完成之后,查了下往上资料,对于第四点,在开发过程中出现频繁,非常的常见,相信很多人都曾遇到,但又有很多人继续摸不到头脑。正好以此加深了印象。
从打印控制台SQL可以看出:一个基本的hibernate save方法的操作流程:
1. 判断所要保存的实例是否已处于持久化状态,如果不是,则将其置入缓存;
2. 根据所要保存的实例计划一条insert sql语句,注意只是计划,并不执行;
3. 事务提交时执行之前所计划的insert语句;
将tx.commit()换成session.flush,此时控制太打印出了insert语句,但是数据库中并没有添加新的记录;
flush方法的主要作用就是清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交。而commit方法则会首先调用flush方法,然后
提交事务。这就是为什么我们仅仅调用flush的时候记录并未插入到数据库中的原因,因为只有提交了事务,对数据库所做的更新才会被保存下来。因为commit方法隐式的调用了flush,所以一般我们都不会显示的调用flush方法。
这是hibernate的flush机制。在一些复杂的对象更新和保存的过程中就要考虑数据库操作顺序的改变以及延时flush是否对程序的结果有影响。如果确实存在着影响,那就可以在需要保持这种操作顺序的位置加入flush强制Hibernate将缓存
中记录的操作flush入数据库,这样看起来也许不太美观,但很有效。
疑问:session.save方法,放入缓存中,SQL直接查询数据库是查不出来的。
flush()方法之后,会打印出执行SQL,但是数据库中,还是没有。SQL直接查询却能查出数据来。
1、flush() 之后这个实体数据存放在什么地方?和save()方法一样的缓存,那SQL也应该是取不到的。
2、既然flush方法之后数据没有进数据库,SQL直接查询,利用session.createSQLQuery(sql) 查询,直接查得应该不是数据库,他查询的又是什么地方?
分享到:
相关推荐
### Hibernate的Flush机制详解 #### 引言 Hibernate作为Java领域中最流行的ORM(Object-Relational Mapping)框架之一,极大地简化了数据访问层的开发工作,使得开发者能够更专注于业务逻辑而非底层的数据交互细节...
在深入理解Hibernate中的flush机制时,我们首先要明白的是,Hibernate是一个ORM(对象关系映射)框架,它在Java应用程序和数据库之间提供了一种抽象层。flush机制是Hibernate中非常重要的一部分,它涉及到对象的状态...
综上所述,理解Hibernate的Flush机制以及它与事务和隔离级别的关系,是优化ORM性能和保证数据一致性的关键。通过合理配置和使用,我们可以使Hibernate在满足业务需求的同时,提供更高效、更稳定的服务。
`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...
在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...
### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...
当修改对象并调用Session的flush()方法时,Hibernate会将一级缓存中的脏数据同步到数据库。 **4. 二级缓存配置与选择:** 二级缓存需要配合特定的缓存提供者(如Ehcache、Infinispan等)来实现。开发者需要在...
Session_flush 是 Hibernate 中的一种机制,用于控制当前 Session 中的对象何时被 flush 到数据库中。flush 操作可以将 Session 中的变化同步到数据库中,从而保持数据的一致性。 隔离级别是数据库事务中的一个概念...
在Java的Hibernate框架中,一级缓存是Session对象内置的缓存机制,它的存在是为了优化数据库操作,减少对数据库的直接访问,从而提高应用程序的性能。一级缓存的生命周期与Session对象相同,也就是说,只要Session...
### Hibernate缓存机制详解 #### 一、Hibernate缓存机制原理及配置 **1.1 Hibernate缓存概述** Hibernate作为一款流行的Java持久层框架,其缓存机制是提高应用程序性能的关键之一。缓存的主要作用在于减少数据库...
Hibernate的缓存机制是优化应用程序性能的关键组成部分,它通过存储数据副本减少对数据库的直接访问,从而提升系统响应速度。缓存主要分为两类:一级缓存(Session缓存)和二级缓存。 一级缓存是Hibernate的核心...
在Java的持久化框架Hibernate中,缓存机制和Session对象的管理是其高效运作的关键要素。本文将深入探讨这两个主题,以帮助开发者更好地理解和利用Hibernate。 首先,让我们聚焦于Hibernate的缓存机制。缓存的存在是...
Hibernate的缓存机制是优化数据库访问性能的关键组成部分。在Hibernate中,缓存主要分为三个层次:一级缓存、二级缓存以及集群范围的缓存。 一级缓存,也称为Session缓存,存在于单个Session实例中。其目的是减少对...
### 详解Hibernate的缓存机制及其配置代码 #### 一、缓存概念及目的 缓存作为一种优化技术,在软件开发中扮演着极其重要的角色。它位于应用程序与物理数据源(如数据库)之间,用于临时存储数据的副本,旨在减少...
Hibernate 提供了两种批量更新机制:一级缓存(First-Level Cache)和批量抓取(Batching)。 一级缓存 Hibernate 的一级缓存是指 Session 对象中缓存的所有对象。在批量更新时,如果不及时清除一级缓存,可能会...
3. **Flush模式**: Hibernate有四种Flush模式:AUTO、COMMIT、MANUAL和NEVER。在大数据批处理中,一般使用MANUAL或COMMIT模式,以控制何时将脏数据刷新到数据库,避免频繁的自动刷新影响性能。 4. **Query....
6. 刷新(Flush):这部分讨论了Hibernate中的刷新机制,即何时以及如何将持久化上下文中的更改提交到数据库。 7. 数据库访问(Database Access):深入探讨Hibernate如何通过抽象层简化数据库访问代码。 8. 事务与...
然而,使用Hibernate时,缓存机制的合理配置对于提升应用性能至关重要。本文将深入探讨Hibernate使用缓存时可能遇到的数据同步问题,以及如何有效解决这些问题。 #### Hibernate缓存机制概述 Hibernate提供了两种...
1. **对象关系映射(ORM)**:Hibernate 提供了一种将Java对象与数据库表之间的映射机制。通过配置XML文件(通常是`hibernate.cfg.xml`和`*.hbm.xml`),可以定义对象和表之间的关系,使得开发者可以像操作普通Java...
1. **资源管理**:Hibernate通过自动化的资源管理机制,简化了数据库连接的获取与释放过程,避免了手动管理数据库连接带来的资源泄漏风险。 2. **简化持久化操作**:相较于传统的JDBC,Hibernate提供了一种更为高级...