`

session.flush与transaction.commit

阅读更多

以session的save方法为例来看一个简单、完整的事务流程,如下是代码片段:

…………………………………………………………………………

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

session.save(customer);//之前已实例化好了的一个对象

tx.commit();

…………………………………………………………………………

示例很简单,就是向数据库中插入一条顾客信息,这是一个最简单的数据库事务。在这个简单的过程中,Hibernate为我们做了一些什么事情呢?为了更好的观察,我们将Hibernate的”show_sql”属性设置为true,然后运行我们的程序,控制台打印出如下信息:

Hibernate: select max(ID) from CUSTOMER

Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

这里也许看不出什么端倪来,现在在session.save(customer)后面加一行代码,输出这个customer的OID,System.out.println(customer.getId()),再次运行程序,控制台输出为:

Hibernate: select max(ID) from CUSTOMER

22

Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

OID在insert语句之前输出,这可以说明两个问题:1.insert语句并不是在执行save的时候发送给数据库的;2.insert语句是在执行commit的时候发送给数据库的。结合前面我们所说过的:执行save的时候,Hibernate会首先把对象放入缓存,然后计划一条insert语句。一个基本的插入流程就出来了:

1.  判断所要保存的实例是否已处于持久化状态,如果不是,则将其置入缓存;

2.  根据所要保存的实例计划一条insert sql语句,注意只是计划,并不执行;

3.  事务提交时执行之前所计划的insert语句;

后台还打印出了select max(ID) from CUSTOMER,这主要是为了给customer赋予一个OID,因为一般情况下临时对象的OID是NULL。

接着我们做两个测试:

1.  将tx.commit();注释掉,此时控制台没有打印出insert语句;

2.  将tx.commit()换成session.flush,此时控制太打印出了insert语句,但是数据库中并没有添加新的记录;

通过查阅Hibernate的API可以知道flush方法的主要作用就是清理缓存,强制数据库

与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交。而commit方法则会首先调用flush方法,然后提交事务。这就是为什么我们仅仅调用flush的时候记录并未插入到数据库中的原因,因为只有提交了事务,对数据库所做的更新才会被保存下来。因为commit方法隐式的调用了flush,所以一般我们都不会显示的调用flush方法。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/humao84229247/archive/2010/05/30/5634861.aspx

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    2022年Hibernate下数据批量处理Java教程.docx

    Transaction tx = session.beginTransaction(); for (int i=0; i; i++) { Customer customer = new Customer(...); session.save(customer); if (i % 20 == 0) { session.flush(); session.clear(); } } tx....

    hibernate的flush机制

    在Hibernate中,Flush机制是用于同步Session缓存与数据库之间变化的关键机制。当开发人员调用Session的`save()`, `update()`, `delete()`等方法时,Hibernate并不会立即执行SQL语句,而是将这些操作记录在其内部的一...

    在Hibernate中处理批量更新和批量删除

    Transaction tx = session.beginTransaction(); Iterator<Customer> customers = session.createQuery("from Customer c where c.age > 0").list().iterator(); while (customers.hasNext()) { Customer customer =...

    详解Hibernate事务处理机制

    Transaction transaction = session.beginTransaction(); ``` ##### 4.2 提交与回滚 事务提交或回滚决定了事务是否生效。成功完成事务操作后,应调用`transaction.commit()`;若出现异常情况,则调用`transaction....

    hibernate连接数据[Mysql]的代码实例

    session.flush(); session.clear(); } } transaction.commit(); session.close(); ``` 以上就是使用Hibernate连接MySQL数据库的基本步骤和操作示例。注意,实际应用中还需要考虑事务管理、异常处理、性能...

    Hibernate入门

    本文旨在深入探讨Hibernate事务管理机制,特别是JDBC Transaction与JTA Transaction在Hibernate中的实现方式及其区别。 #### 二、Hibernate事务管理配置 在使用Hibernate进行开发时,可以通过配置`hibernate....

    Hibernate下数据批量处理解决方案

    Transaction tx = session.beginTransaction(); for (int i = 0; i ; i++) { Customer customer = new Customer(.....); session.save(customer); if (i % 20 == 0) { // 执行批处理并释放内存 session.flush()...

    Hibernate Part 2:单表CRUD

    此外,`Session`的`flush()`方法用于将内存中的改变同步到数据库,而`clear()`则可以清除当前Session中的对象。事务管理在Hibernate中非常重要,通常使用`Transaction`对象来包裹一组操作,确保其原子性。 对于更...

    Hibernate_Session_Transaction

    - `beginTransaction()`:开始一个新的数据库事务,返回与当前`Session`相关的`Transaction`对象。 - `getTransaction()`:获取与当前`Session`相关的`Transaction`对象,以便检查或控制事务状态。 - `close()`:...

    在Hibernate应用中处理批量更新和批量删除

    1. **使用`flush()`和`evict()`方法**:在修改实体后,主动调用`session.flush()`方法,使Hibernate将缓存中的变更同步到数据库,然后调用`session.evict(entity)`方法,从缓存中移除实体,这样下一次操作不会受到...

    jsp Hibernate批量更新和批量删除处理代码.docx

    Transaction tx = session.beginTransaction(); Iterator<Customer> customers = session.find("from Customer c where c.age > 0").iterator(); while (customers.hasNext()) { Customer customer = customers....

    第一个hibernate程序及解释

    transaction.commit(); ``` 在提供的文档“第一个Hibernate程序.doc”和源代码文件“FirstHibernate”中,你可以找到更具体的实现细节和解释,这对于理解并实践你的第一个Hibernate程序非常有帮助。通过这个起点,...

    hibernate性能优化.doc

    Transaction tx = session.beginTransaction(); for (int i = 0; i ; i++) { News n = new News(); session.save(n); if (i % 20 == 0) { session.flush(); session.clear(); tx.commit(); tx = session....

    java-hibernate持久化

    - 事务提交(`transaction.commit()`)。 - 应用执行查询操作时。 - 显式调用`session.flush()`方法。 总结来说,Hibernate的持久化机制和一级缓存是其高效处理数据库操作的关键。理解并熟练掌握这些概念,可以帮助...

    HibernateTemplate类的使用

    然而,在实际应用中,如果开发者希望对事务进行更细粒度的控制,可以考虑使用`@Transactional`注解或者显式地使用`Session`的`beginTransaction`和`commit`/`rollback`方法来进行事务管理。需要注意的是,直接在`...

    hibernate笔记

    Transaction tx = session.beginTransaction(); // 创建一个新的持久状态对象 Guestbook gb = new Guestbook(); gb.setName("aozi"); gb.setTitle(""); session.save(gb); // 通过session保存对象,此时gb变为持久...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    当我们在Session上进行操作时,这些操作不会立即反映到数据库中,而是被缓存起来,直到调用`flush()`方法或者事务提交时才会真正执行。 在开始使用Session之前,需要配置Hibernate的环境,包括创建SessionFactory,...

    hibernate批量操作实例详解

    例如,可以设置一个累加器,每保存一定数量的对象后,就调用`session.flush()`将缓存中的数据提交,然后清空缓存`session.clear()`,并重新开始新的事务。下面是一个示例: ```java private void testUser() ...

    Hibernate技术手册.chm(台湾写的)

    - Hibernate的事务API:`Session.beginTransaction()`、`Transaction.commit()`、`Transaction.rollback()`。 - Spring整合Hibernate时的声明式事务管理。 6. **查询语言HQL**: - HQL简介:面向对象的查询语言...

    Hibernate将图片插入数据库

    transaction.commit(); session.close(); ``` 4. **查询与显示图片**: 要从数据库中检索图片,我们可以使用`Query`或`Criteria` API。获取到结果后,将其转换回图片并显示。注意,由于二进制数据通常不适合直接在...

Global site tag (gtag.js) - Google Analytics