session flush方法主要做了两件事:
* 清理缓存
* 执行sql
session在什么情况下执行flush
* 默认在事务提交时
* 显示的调用flush
* 在执行查询前,如:iterate
hibernate按照save(insert),update、delete顺序提交相关操作
例:当我们想以下顺序执行代码(先insert,再update,再insert),代码如下:
1session = HibernateUtils.getSession();
2tx = session.beginTransaction();
3
4User3 user = new User3();
5user.setId("001");
6user.setName("张三");
7
8session.save(user);
9
10user.setName("王五");
11session.update(user);
12
13User3 user3 = new User3();
14user3.setId("002");
15user3.setName("李四");
16session.save(user3);
17
18//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
19//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
20//Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?
21//hibernate按照save(insert),update、delete顺序提交相关操作
22tx.commit();
执行上面的代码,通过查看日志,得到的执行顺序为insert,insert,update
因此可以用session.flush来实现执行,代码如下:
1session = HibernateUtils.getSession();
2tx = session.beginTransaction();
3
4User3 user = new User3();
5user.setId("003");
6user.setName("张三");
7
8session.save(user);
9
10user.setName("王五");
11session.update(user);
12
13session.flush();
14
15User3 user3 = new User3();
16user3.setId("004");
17user3.setName("李四");
18session.save(user3);
19
20//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
21//Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?
22//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
23//因为我们在session.udpate(user)后执行了flush,所以在清理缓存时执行flush前的sql不会生成
24//sql会按照我们的意愿执行
25tx.commit();这样我们就实现insert,update,insert的顺序。这在一些复杂的情况下很有用
2tx = session.beginTransaction();
3
4User3 user = new User3();
5user.setId("001");
6user.setName("张三");
7
8session.save(user);
9
10user.setName("王五");
11session.update(user);
12
13User3 user3 = new User3();
14user3.setId("002");
15user3.setName("李四");
16session.save(user3);
17
18//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
19//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
20//Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?
21//hibernate按照save(insert),update、delete顺序提交相关操作
22tx.commit();
执行上面的代码,通过查看日志,得到的执行顺序为insert,insert,update
因此可以用session.flush来实现执行,代码如下:
1session = HibernateUtils.getSession();
2tx = session.beginTransaction();
3
4User3 user = new User3();
5user.setId("003");
6user.setName("张三");
7
8session.save(user);
9
10user.setName("王五");
11session.update(user);
12
13session.flush();
14
15User3 user3 = new User3();
16user3.setId("004");
17user3.setName("李四");
18session.save(user3);
19
20//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
21//Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?
22//Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
23//因为我们在session.udpate(user)后执行了flush,所以在清理缓存时执行flush前的sql不会生成
24//sql会按照我们的意愿执行
25tx.commit();这样我们就实现insert,update,insert的顺序。这在一些复杂的情况下很有用