`
azrael6619
  • 浏览: 580037 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

session.flush()、transaction.commit、session.close()

阅读更多

以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方法。

   

     在session.close()里会自动调用flush(),而flush()又可以“把sql语句发送到数据库”。但是“数据库没有反应”。

 



1、session在什么情况下清理缓存:
* 默认情况下,当应用程序提交事务,如:Transaction.commit;
* 当我们显示调用flush的时候
* 在执行某些查询的时候,如:iterate

2、session.flush()主要完成两件事情:
* 清理缓存
* 执行sql

3、flush执行的顺序:hibernate按照save,update,delete顺序提交相关操作

 

 

分享到:
评论
3 楼 nanjiwubing123 2012-04-26  
2 楼 nanjiwubing123 2012-04-26  
不错不错 很具体.
1 楼 looyo 2011-04-09  
需不需要显式调用flush ,应该和session的flushMode有关系吧。

相关推荐

    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连接数据[Mysql]的代码实例

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

    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事务处理机制

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

    hibernate的flush机制

    1. **显式调用**:开发人员可以直接调用`session.flush()`方法来强制执行Flush操作。 2. **事务提交**:在事务的提交阶段,为了确保数据的一致性和持久性,Hibernate会自动进行Flush操作。 3. **查询执行前**:当...

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

    session.close(); ``` 这段代码首先开启一个事务,然后通过HQL(Hibernate查询语言)查询所有年龄大于零的客户。对于每一个查询到的Customer对象,增加其年龄并立即调用`flush()`方法同步更新数据库,然后调用`...

    Hibernate入门

    session.flush(); tx.commit(); // 提交事务 // 或者 tx.rollback(); // 回滚事务 ``` 4. **关闭资源**:最后,需要关闭Session对象释放资源。 ```java session.close(); ``` 在JDBC事务管理中,关键的...

    hibernate笔记

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

    Hibernate_Session_Transaction

    在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...

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

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

    java-hibernate持久化

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

    hibernate批量操作实例详解

    HibernateUtil.closeSession(); } ``` 另外,为了防止二级缓存造成的问题,可以在配置文件中关闭二级缓存,设置`hibernate.cache.use_second_level_cache`为`false`。 2. **批量更新** 批量更新与批量插入...

    Hibernate将图片插入数据库

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

    Hibernate查询语言

    Transaction tx = session.beginTransaction(); for (int i = 0; i ; i++) { Customer customer = new Customer(.....); session.save(customer); if (i % 20 == 0) { // 每20条数据执行一次flush和clear ...

    hibernateApi

    在 Hibernate 中,可以通过 `Session` 的 `beginTransaction()` 和 `commit()` 方法来处理事务。例如: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.begin...

    hibernate-release-5.0.7.Final.zip官方

    session.flush(); session.clear(); } } tx.commit(); } catch (Exception e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } ``` #### 五、常见问题解答 **...

    hibernate存取oracle的clob

    Transaction tx = session.beginTransaction(); User user = new User(); user.setName("Jacky"); user.setAge(20); user.setContent(Hibernate.createClob("This is my resume")); // 创建 CLOB 对象 session....

    Hibernate批量处理

    Transaction tx = session.beginTransaction(); for (int i = 0; i ; i++) { // 创建并保存Customer对象 Customer customer = new Customer(); customer.setName("Customer " + i); customer.setAge(i % 100); ...

    Hibernate批量更新与删除实例浅析

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

Global site tag (gtag.js) - Google Analytics