一、关注2个方法:openSession和getCurrentSession
1、openSession 每次都是新的,需要close
2、getCurrentSession从上下文找,如果有,用旧的,如果没有,建新的
①. 用途,界定事务的边界(即可以在2个dao层用到同意Session)
②. 事务提交自动close
③. thread本地事务;jta是分布式事务,就是在2个数据库中用到的,并且需要应用服务器的支持,Tomcat是不支持的
// 本地thread 使用connection(也是Session)来管理事务
<property name="current_session_context_class">thread</property>
// 使用全局事务,用一个Connection是管理不了的
<property name="current_session_context_class">jta</property>
二、持久化对象三种状态的关键区别(Transient,persistent,detached)
1、transient:内存中一个对象,没Id,缓存中也没有
2、persistent:内存中有,Session缓存中有,数据库有(Id)
3、detached:内存中有,Session缓存中没有,数据库有
三、获取数据库对象时load和get的区别:
1、load返回的是代理对象,等到真正用到对象的内容时才发出SQL语句
2、get直接从数据库加载,不会延迟
3、不存在记录时,load会抛出异常,而get方法会直接返回null
四、数据库中的Update方法使用
1、用来更新detached对象,更新完成后转为persistent状态
2、更新transient对象会报错,主要是因为数据库中没有跟记录的Id
3、更新自己设定id的transient对象可以(删除即delete方法也可以的),而且要数据库有对应的记录
4、p状态的对象只要设定了不同值的字段就会全部字段更新
5、更新部分更改的字段:
①. 在表的注解上添加@DynamicUpdate,或者在xml下也可以
②. 使用HQL进行更新(建议)
③. merge()方法也可以,不过如果是Session关闭后会执行select语句
五、Session中的clear()和flush()
1、无论是load还是get,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()可以用来强制清除缓存。
2、flush方法可以进行从内存到数据库的同步!(其中有FlushModel的设置)