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中清除,sessionEntryEntries属性中拿出

无法成功提交事务,因为hibernate在清理缓存时,在sessioninsertions临时集合中取出user对象进行insert操作后需要更新EntityEntriesexistsInDatabase属性为true,而我们采用evict已经将usersessionEntity Entries中拿出了,所以找不到相关数据,无法更新,抛出异常

 

解决方式是在evict前之行session.flush,insertions清除,将existsInDatabase设置为true,当执行evict后提交时就不会发生异常情况了,因为hibernate清理缓存时,在sessioninsertions集合中无法找到user对象,所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态

 

 

 

测试native主键生成策略:

因为user得主键生成策略为native,所以调用session.save后将执行insert语句,返回由数据库生成的id,纳入了session的管理,还修改了session中的existsInDatabase状态为true

 

这种情况evictcommit没有任何问题:因为save的同时已经发出insert语句并清理insertions

更新existsInDatabase状态为true,在执行evict时将对象从session中拿出,commit时由于insertions不存在,所以不会发出insert语句也不会更新existsInDatabase的状态,所以不存在主键生成策略为uuid时遇到的问题

 

测试assign主键生成策略:

测试用例:先增加一个,然后修改,然后再增加

但是生成语句时却是:先增加,然后修改

hibernate按照save,update,delete顺序提交相关操作

 

如何按照我们的意图操作?

update后显示执行flush

posted on 2009-05-06 21:43  IT Person  阅读(591)  评论(0编辑  收藏  举报