Hibernate视频学习笔记(5)SessionFlush简介
2009-05-06 21:43
302 查看
Session flush测试:
Session flush方法主要做了两件事情:
清理缓存:
执行SQL:
session在什么情况下执行flush
默认在事务提交时
显示的调用flush
在执行查询前,如:iterate
在uuid情况下:save时不会发sql语句(与native不同)
执行flush会立刻发出SQL,临时集合会清理掉
数据库隔离级别:
Select @@tx_isolation;
Set transaction isolation level read uncommitted;
测试uuid主键生成策略:
因为user的主键生成策略采用uuid,所以调用完成save后,只是将user纳入了session管理,不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
调用flush,hibernate会清理缓存,执行SQL
如果数据库的隔离级别设置为未提交读,那么我们可以看到flush过的数据,并且我们看到session中的existsInDatabase状态为true
提交事务默认情况下commit操作会先执行flush清理缓存,所以不用显示调用flush
commit后数据是无法回滚的
evict将对象从session中清除,session的EntryEntries属性中拿出
无法成功提交事务,因为hibernate在清理缓存时,在session的insertions临时集合中取出user对象进行insert操作后需要更新EntityEntries的existsInDatabase属性为true,而我们采用evict已经将user从session的Entity Entries中拿出了,所以找不到相关数据,无法更新,抛出异常
解决方式是在evict前之行session.flush,将insertions清除,将existsInDatabase设置为true,当执行evict后提交时就不会发生异常情况了,因为hibernate清理缓存时,在session的insertions集合中无法找到user对象,所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态
测试native主键生成策略:
因为user得主键生成策略为native,所以调用session.save后将执行insert语句,返回由数据库生成的id,纳入了session的管理,还修改了session中的existsInDatabase状态为true
这种情况evict后commit没有任何问题:因为save的同时已经发出insert语句并清理insertions
更新existsInDatabase状态为true,在执行evict时将对象从session中拿出,commit时由于insertions不存在,所以不会发出insert语句也不会更新existsInDatabase的状态,所以不存在主键生成策略为uuid时遇到的问题
测试assign主键生成策略:
测试用例:先增加一个,然后修改,然后再增加
但是生成语句时却是:先增加,然后修改
hibernate按照save,update,delete顺序提交相关操作
如何按照我们的意图操作?
在update后显示执行flush
Session flush方法主要做了两件事情:
清理缓存:
执行SQL:
session在什么情况下执行flush
默认在事务提交时
显示的调用flush
在执行查询前,如:iterate
在uuid情况下:save时不会发sql语句(与native不同)
执行flush会立刻发出SQL,临时集合会清理掉
数据库隔离级别:
隔离级别 | 是否脏读 | 是否存在不可重复读 | 是否存在幻读 |
Read Uncommited | 是 | 是 | 是 |
Read commited | 否 | 是 | 是 |
Repeatable Read | 否 | 否 | 是 |
Serializable | 否 | 否 | 否 |
Set transaction isolation level read uncommitted;
测试uuid主键生成策略:
因为user的主键生成策略采用uuid,所以调用完成save后,只是将user纳入了session管理,不会发出insert语句,但是id已经生成,session中的existsInDatabase状态为false
调用flush,hibernate会清理缓存,执行SQL
如果数据库的隔离级别设置为未提交读,那么我们可以看到flush过的数据,并且我们看到session中的existsInDatabase状态为true
提交事务默认情况下commit操作会先执行flush清理缓存,所以不用显示调用flush
commit后数据是无法回滚的
evict将对象从session中清除,session的EntryEntries属性中拿出
无法成功提交事务,因为hibernate在清理缓存时,在session的insertions临时集合中取出user对象进行insert操作后需要更新EntityEntries的existsInDatabase属性为true,而我们采用evict已经将user从session的Entity Entries中拿出了,所以找不到相关数据,无法更新,抛出异常
解决方式是在evict前之行session.flush,将insertions清除,将existsInDatabase设置为true,当执行evict后提交时就不会发生异常情况了,因为hibernate清理缓存时,在session的insertions集合中无法找到user对象,所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态
测试native主键生成策略:
因为user得主键生成策略为native,所以调用session.save后将执行insert语句,返回由数据库生成的id,纳入了session的管理,还修改了session中的existsInDatabase状态为true
这种情况evict后commit没有任何问题:因为save的同时已经发出insert语句并清理insertions
更新existsInDatabase状态为true,在执行evict时将对象从session中拿出,commit时由于insertions不存在,所以不会发出insert语句也不会更新existsInDatabase的状态,所以不存在主键生成策略为uuid时遇到的问题
测试assign主键生成策略:
测试用例:先增加一个,然后修改,然后再增加
但是生成语句时却是:先增加,然后修改
hibernate按照save,update,delete顺序提交相关操作
如何按照我们的意图操作?
在update后显示执行flush
相关文章推荐
- Hibernate视频学习笔记(3)常用映射标签及属性
- 传智播客Hibernate视频教程学习笔记1
- 传智播客Hibernate视频教程学习笔记6
- 传智播客Hibernate视频教程学习笔记10 11 12 13
- 传智播客Hibernate视频教程学习笔记24
- 传智播客Hibernate视频教程学习笔记27
- 传智播客Hibernate视频教程学习笔记32
- 传智播客Hibernate视频教程学习笔记34
- 传智播客Hibernate视频教程学习笔记40
- 传智播客Hibernate视频教程学习笔记51
- 传智播客Hibernate视频教程学习笔记55
- Hibernate视频学习笔记(4)多对一及一对一关联映射
- 传智播客Hibernate视频教程学习笔记21
- 传智播客Hibernate视频教程学习笔记25
- 传智播客Hibernate视频教程学习笔记46
- Hibernate视频学习笔记(6)一对多关联映射
- hibernate学习笔记(摘自尚硅谷——佟刚视频)
- 传智播客Hibernate视频教程学习笔记2
- 传智播客Hibernate视频教程学习笔记7
- 传智播客Hibernate视频教程学习笔记17