以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方法。
分享到:
相关推荐
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机制是用于同步Session缓存与数据库之间变化的关键机制。当开发人员调用Session的`save()`, `update()`, `delete()`等方法时,Hibernate并不会立即执行SQL语句,而是将这些操作记录在其内部的一...
Transaction tx = session.beginTransaction(); Iterator<Customer> customers = session.createQuery("from Customer c where c.age > 0").list().iterator(); while (customers.hasNext()) { Customer customer =...
Transaction transaction = session.beginTransaction(); ``` ##### 4.2 提交与回滚 事务提交或回滚决定了事务是否生效。成功完成事务操作后,应调用`transaction.commit()`;若出现异常情况,则调用`transaction....
session.flush(); session.clear(); } } transaction.commit(); session.close(); ``` 以上就是使用Hibernate连接MySQL数据库的基本步骤和操作示例。注意,实际应用中还需要考虑事务管理、异常处理、性能...
本文旨在深入探讨Hibernate事务管理机制,特别是JDBC Transaction与JTA Transaction在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()...
此外,`Session`的`flush()`方法用于将内存中的改变同步到数据库,而`clear()`则可以清除当前Session中的对象。事务管理在Hibernate中非常重要,通常使用`Transaction`对象来包裹一组操作,确保其原子性。 对于更...
- `beginTransaction()`:开始一个新的数据库事务,返回与当前`Session`相关的`Transaction`对象。 - `getTransaction()`:获取与当前`Session`相关的`Transaction`对象,以便检查或控制事务状态。 - `close()`:...
1. **使用`flush()`和`evict()`方法**:在修改实体后,主动调用`session.flush()`方法,使Hibernate将缓存中的变更同步到数据库,然后调用`session.evict(entity)`方法,从缓存中移除实体,这样下一次操作不会受到...
Transaction tx = session.beginTransaction(); Iterator<Customer> customers = session.find("from Customer c where c.age > 0").iterator(); while (customers.hasNext()) { Customer customer = customers....
transaction.commit(); ``` 在提供的文档“第一个Hibernate程序.doc”和源代码文件“FirstHibernate”中,你可以找到更具体的实现细节和解释,这对于理解并实践你的第一个Hibernate程序非常有帮助。通过这个起点,...
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....
- 事务提交(`transaction.commit()`)。 - 应用执行查询操作时。 - 显式调用`session.flush()`方法。 总结来说,Hibernate的持久化机制和一级缓存是其高效处理数据库操作的关键。理解并熟练掌握这些概念,可以帮助...
然而,在实际应用中,如果开发者希望对事务进行更细粒度的控制,可以考虑使用`@Transactional`注解或者显式地使用`Session`的`beginTransaction`和`commit`/`rollback`方法来进行事务管理。需要注意的是,直接在`...
Transaction tx = session.beginTransaction(); // 创建一个新的持久状态对象 Guestbook gb = new Guestbook(); gb.setName("aozi"); gb.setTitle(""); session.save(gb); // 通过session保存对象,此时gb变为持久...
当我们在Session上进行操作时,这些操作不会立即反映到数据库中,而是被缓存起来,直到调用`flush()`方法或者事务提交时才会真正执行。 在开始使用Session之前,需要配置Hibernate的环境,包括创建SessionFactory,...
例如,可以设置一个累加器,每保存一定数量的对象后,就调用`session.flush()`将缓存中的数据提交,然后清空缓存`session.clear()`,并重新开始新的事务。下面是一个示例: ```java private void testUser() ...
- Hibernate的事务API:`Session.beginTransaction()`、`Transaction.commit()`、`Transaction.rollback()`。 - Spring整合Hibernate时的声明式事务管理。 6. **查询语言HQL**: - HQL简介:面向对象的查询语言...
transaction.commit(); session.close(); ``` 4. **查询与显示图片**: 要从数据库中检索图片,我们可以使用`Query`或`Criteria` API。获取到结果后,将其转换回图片并显示。注意,由于二进制数据通常不适合直接在...