在使用hibernate时,我们首先要记住的是我们操作的是session,或者说session的缓存,而不是数据库
1、sesson 脏检查:
Transcation tx=session.beginTracsaction();
User user=(User)session.get(User.class,1);
user.setName("a new name");
tx.commit(); 这里会执行一个update ,称为session脏检查
原理:当一个对象进入session后,session会对其生成一个快照, 当session清理缓存时,进行比对,从而执行sql
2、session 清理缓存的时间点
a、commit
b、如果执行查询操作时,session内对象发生变化,会清理缓存,使查询结果与数据库一致
c、flush
3、对象的四种状态
临时、持久、删除、游离
4、session的一下方法可以将持久化对象变为游离对象
a、close(); b evict();不建议 c、clear() ;多用于批量操作
5、session的save方法做了什么?
a、将save对象放入session缓存,使之变为持久化状态
b、分配OID
c、计划执行insert(清理换存时执行)
6、persist() 与 save()
save立即分配OID,persist可能要等到清理session缓存时才分配
persist在事务边界外将不计化执行sql,而save的执行insert与事务边界无关
其他类似
7、get()与load()
当数据库中不存在与OID对应对象时,load方法throw ObjectNotFoundException get方法return null
load()采用lazy=ture 除非显式配置了lazy=false ,当不适用get方法时,使用load(适用于要删除、或建立该对象与其他对象关系时)
get() 采用lazy=false ,并忽略对lzay的显式设置,适用于需要访问该对象及其属性的情况
8、session 的update 方法
将一个游离对象转为持久对象,并 “计划” 执行 一个update sql
如果将一个与已经存于session的对象的OID相同的对象放入session 将抛出 NonUniqueException
9、session 的 saveOrUpdate()
传入的对象如果之前是临时状态,执行insert 如果是游离状态,执行update
10、 cascade 属性
none : 忽略关联对象,默认
save-iupdate : save() or update() 级联的进行 save or update
persist : persist() 时 级联
merge : merge()时级联
delete : delete时级联
lock,replicate,evict,refresh : 与以上同理
all : 包含以上,不包含以下
delete-orphan : 删除所有和当前对象接触关联关系的对象
all-delete-orphan : 包含以上全部