针对昨天同事遇到的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的Flush操作。Flush是Hibernate将内存中的对象状态同步到数据库的过程。当Session中的对象被...
`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...
在使用Hibernate进行数据库操作时,事务管理和`flush`方法的正确使用至关重要,因为它们直接影响到数据的一致性和安全性。在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些...
`flush()`方法强迫Hibernate执行这个过程,即使事务还没有结束。例如,在上述代码示例中,当第二次调用`setName()`并调用`flush()`后,Hibernate会立即执行两次UPDATE操作,即使事务尚未提交。这在需要立即反映数据...
- 当执行`Session#flush()`方法时,开发者可以显式地触发flush。 2. **flush过程详解**: - 当调用`Session#save()`时,Hibernate并不会立即执行SQL插入语句,而是将对象状态改为“临时”(Transient),并将其放...
这意味着对象与数据库中的记录建立了绑定,任何对实体对象的修改都会在Session flush时同步到数据库。可以通过Session的`save()`, `saveOrUpdate()`, `merge()`等方法将临时状态的对象转换为持久化状态。 3. **游离...
在实际使用中,开发者通常会在一个`Session`生命周期内进行一系列操作,然后在适当的时候调用`flush()`方法强制Hibernate同步数据库,最后在事务结束时调用`commit()`来完成事务。这些方法的正确组合使用是实现高效...
在 Hibernate 中,可以通过使用 Transaction 的 setTransactionIsolation() 方法来设置事务的隔离级别。例如: ```java Transaction transaction = session.beginTransaction(); transaction....
在持久层框架Hibernate中,`flush()`和`evict()`方法是开发者在处理数据时经常会遇到的两个重要概念。它们对于理解Hibernate的工作机制及其缓存管理至关重要。本文将通过一系列具体的示例来探讨这两个方法的作用与...
Hibernate 提供了多种方式来执行原生 SQL 语句,其中之一是使用 `Session.createSQLQuery()` 方法,该方法返回一个 `SQLQuery` 对象,该对象提供了执行原生 SQL 语句的方法。 例如,我们可以使用以下代码来执行一个...
在代码中,我们需要在适当的时候调用`flush()`和`clear()`方法,强制将缓存中的对象写入数据库并清空缓存,从而释放内存。例如: ```java Session session = sessionFactory.openSession(); Transaction tx = ...
本文将讨论使用 Hibernate 批量更新大量数据的方法和技巧。 批量更新的必要性 在实际应用中,我们经常需要将大量数据插入到数据库中,例如数据迁移、数据同步、数据备份等场景。在这些场景中,如果使用传统的 ...
### Hibernate的各种保存方式的区别 ...理解这些方法的区别有助于更有效地管理Hibernate中对象的状态,确保数据正确地存储到数据库中。在实际开发中,根据具体的需求选择合适的方法是非常重要的。
接下来,我们将深入探讨Hibernate的方法使用,包括XML配置、Session管理和Criteria查询。 **一、Hibernate的XML配置** Hibernate的核心配置文件是`hibernate.cfg.xml`,它包含了数据库连接信息、实体类映射和...
### Hibernate 常用方法详解 #### 一、前言 Hibernate 是一款强大的对象关系映射(ORM)框架,它简化了 Java 应用程序与数据库之间的交互过程。本文将详细介绍 Hibernate 中常用的几种方法,包括 `save`, `update`...
3. **Flush模式**: Hibernate有四种Flush模式:AUTO、COMMIT、MANUAL和NEVER。在大数据批处理中,一般使用MANUAL或COMMIT模式,以控制何时将脏数据刷新到数据库,避免频繁的自动刷新影响性能。 4. **Query....
在业务逻辑处理中,通常使用Session的beginTransaction、save/merge、flush和commit等方法来完成数据库操作。 3. **Query和Criteria API**:提供两种方式执行查询,一是HQL(Hibernate Query Language),类似于SQL...
本文将深入探讨Hibernate Session的详细方法及其应用场景,旨在为开发者提供一份全面、实用的指南。 #### 一、Session 的生命周期与事务管理 Hibernate Session的生命周期通常包括打开、使用和关闭三个阶段。在...
`flush()`、`clear()`和`close()`方法分别用于清理缓存并执行SQL(但不提交)、清空缓存和回滚事务,以及清空缓存并提交事务。值得注意的是,`Session`中的缓存会存储所有被操作的对象,如`save`、`update`、`get`和...