Hibernate session flush commit 收藏
session.flush(): execute the SQL statements needed to synchronize the JDBC connection's
state with the state of objects held in memory.
This process, flush, occurs by default at the following points
• before some query executions
• from org.hibernate.Transaction.commit()
• from Session.flush()
处于persistent状态的bean,如果在session close之前,没有调用session.flush() 那么它的数据不会持久化到数据库中,即使做了commit(); 不过有一种情况比较特殊,就是transaction.commit()会先调用session.flush()方法。
以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/bzhang19841212/archive/2008/03/11/2167290.aspx
分享到:
相关推荐
在业务逻辑处理中,通常使用Session的beginTransaction、save/merge、flush和commit等方法来完成数据库操作。 3. **Query和Criteria API**:提供两种方式执行查询,一是HQL(Hibernate Query Language),类似于SQL...
session.flush(); session.clear(); } } tx.commit(); } catch (Exception e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } ``` #### 五、常见问题解答 **...
当我们在Session上进行操作时,这些操作不会立即反映到数据库中,而是被缓存起来,直到调用`flush()`方法或者事务提交时才会真正执行。 在开始使用Session之前,需要配置Hibernate的环境,包括创建SessionFactory,...
- **显式flush()调用**:应用程序可以主动调用Session的flush()方法,强制清理缓存。 **3. Hibernate的二级缓存结构** 除了Session一级缓存,Hibernate还提供了二级缓存,旨在进一步提升性能。一级缓存是Session...
### Hibernate的Flush机制详解 #### 引言 Hibernate作为Java领域中最流行的ORM(Object-Relational Mapping)框架之一,极大地简化了数据访问层的开发工作,使得开发者能够更专注于业务逻辑而非底层的数据交互细节...
1. SessionImpl:Session的实现类,包含打开、关闭、flush和commit等关键方法。 2. Criteria API:源码中可以看到CriteriaBuilder和CriteriaQuery的实现,用于构建动态查询。 3. QueryTranslator:翻译HQL语句到SQL...
- 使用`Session.flush()`显式触发脏检查,如果发现异常,事务也会回滚。 通过以上内容,我们了解了Hibernate 5在数据持久化和事务管理方面的基本操作和注意事项。在实际项目中,结合事务的隔离级别、锁机制以及适当...
在所有操作完成后,调用`commit`方法将提交事务,此时,Hibernate会清除缓存并更新数据库。 接下来,我们讨论`flush`方法。`flush`是强制Hibernate将缓存中的对象状态同步到数据库的操作,它会按照保存(save)、...
session.flush(); session.clear(); } } transaction.commit(); session.close(); ``` 以上就是使用Hibernate连接MySQL数据库的基本步骤和操作示例。注意,实际应用中还需要考虑事务管理、异常处理、性能...
Hibernate支持JDBC事务管理,通过Session的beginTransaction()开始事务,commitTransaction()提交事务,rollbackTransaction()回滚事务。确保数据的一致性和完整性。 7. **懒加载与级联操作**: - **懒加载**:...
在深入理解Hibernate中的flush机制时,我们首先要明白的是,Hibernate是一个ORM(对象关系映射)框架,它在Java应用程序和数据库之间提供了一种抽象层。flush机制是Hibernate中非常重要的一部分,它涉及到对象的状态...
6. `commit()`: 提交事务,将所有操作写入数据库。 7. `flush()`: 强制将缓存中的数据同步到数据库。 8. `close()`: 关闭Session,释放资源。 **三、Criteria查询** Criteria查询是Hibernate提供的另一种查询方式...
transaction.commit(); session.close(); ``` 这段代码首先打开一个 `Session` 并开始一个事务,然后创建一个新的 `Event` 对象并设置其属性值,接着使用 `Session` 的 `save` 方法将该对象保存到数据库中,最后...
session.getTransaction().commit(); ``` #### 三、Hibernate 连接池配置 连接池管理是优化 Hibernate 性能的关键之一。 - **概念** - 连接池可以预先创建一定数量的数据库连接,当应用程序需要访问数据库时...
- **实现**:通过 `setFlushMode()` 方法设置 `FLUSH_AUTO` 或 `FLUSH_COMMIT` 来控制何时同步数据库。 **3. 继承映射** - **定义**:支持多种继承映射策略,如 joined、single_table 和 table_per_class。 - **...
- 事务提交(`transaction.commit()`)。 - 应用执行查询操作时。 - 显式调用`session.flush()`方法。 总结来说,Hibernate的持久化机制和一级缓存是其高效处理数据库操作的关键。理解并熟练掌握这些概念,可以帮助...
3. **更新(Update)**:调用`merge()`或直接修改对象属性后`flush()`。 4. **删除(Delete)**:`delete()`或`remove()`。 六、 Session与Transaction 在进行数据库操作前,需要创建Session并开启Transaction。...
### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...
// 后执行 tx.commit(); session.close(); } ``` 在 DAO 层,可以使用以下方法来实现批量更新: ```java public void batchInsertCustomers(List<Customer> customerList) { Session session = getSession(); ...
在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...