您的位置:首页 > 其它

Hibernate视频学习笔记(5)SessionFlush简介

2009-05-06 21:43 302 查看
Session flush测试:

Session flush方法主要做了两件事情:

清理缓存:

执行SQL:

session在什么情况下执行flush

默认在事务提交时

显示的调用flush

在执行查询前,如:iterate

在uuid情况下:save时不会发sql语句(与native不同)

执行flush会立刻发出SQL,临时集合会清理掉

数据库隔离级别:

隔离级别

是否脏读

是否存在不可重复读

是否存在幻读

Read Uncommited







Read commited







Repeatable Read







Serializable







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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: