hibernate的flush
session flush方法主要做两件事:
* 清理缓存
* 执行sql
session 在什么情况下执行sql
* 默认在事务提交时
* 显示的调用flush
* 在执行查询前,如 iterator
hibernate 按照save(insert),update,delete顺序提交相关操作,
可以通过flush来改变提交顺序,使hibernate按照我们的意愿执行
因为user的主键生成采用uuid,所以完成save时,只是将user纳入到session的管理
不会发出insert语句,但是已经生成id,session中existsInDatabase状态为false;
session.save(user);
调用flush,hibernate会清理缓存,执行sql;
如果数据库的限制级别为未提交读,那么我们可以看到flush的数据
并且session中existsInDatabase状态未true;
session.flush();
提交事务
默认情况下commit操作会先执行那个flush清理缓存,所以不用显示的调用flush
commit后数据是无法回滚的
transaction.commit();
如果user的主键生成策略为native,在调用session.save后,将执行insert语句,返回由数据库生成的id,
纳入了session管理,修改了session中的existsInDatabase状态为true;
如果数据库隔离级别设置为提交读,则可以看到flush过的数据
--------------------------------------------------------
测试实体对象的特征
junit简介:
* 编写测试类xxxTest,需要继承TestCase
* 编写单元测试方法,测试方法必须以test开头,测试方法不能有返回值和参数,如:
public void testDelete(){}
* 单元测试代码最好新建一个目录
了解hibernate中CRUD操作
了解get和load的区别:
* get不支持lazy,load支持lazy;
* 采用get加载数据,如果没有匹配的数据返回null,而load抛出异常
transient状态的特征
* 在数据库没有与之匹配的数据
* 没有纳入session管理
persistent状态的特征
* persistent状态的对象在数据库中又与之匹配的数据
* 纳入了 session 管理
* 在清理缓存(脏数据检查)时,会和数据库同步
detached状态的特征
* 在数据库中有与之匹配的数据
* 没有纳入session管理