session:
beginTransaction():开启事务就像初始化的数据库连接、语句对象
clear():清楚session中的缓存
close():关闭session,关闭数据库连接
connection():拿到数据库中session中的封装的connection,建议不要使用,因为hibernate中对于连接其实已经做了优化的
contains():判断返回元素对象的
delete():删除一个对象
evict():从缓存中清掉一个数据
flush():让session与数据库进行一次同步
get():从数据库中拿一条数据出来,根据主键取数据
load():懒加载,根据id查,(返回的是代理,不会立即访问数据库)。load不会最先访问数据库,之后第一次加载是才会访问。从缓存中
load中如果是空的null,就会自己new一个Object,不用写if(user !=null)这类代码
saveOrUpdate()、merge():根据ID和version的值来确定是save或是update。对未加入数据库的直接insert,对于已经加入数据库的执行update
persist():插入
与save()的区别:当没开启事务时,save()会插入不成功事务会回滚,persist()插入不成功不会执行事务回滚、
persist()在事务外不会产生insert语句
区别:
http://blog.youkuaiyun.com/pfpfpfpfpf/article/details/4401803
http://hyj0903.blog.163.com/blog/static/3090655220105156574446/
refresh():相当于重新读取一次
update():更新对象
lock():枷锁,把对象变成持久化对象,但不会同步对象的状态
扩展阅读:http://java.chinaitlab.com/base/904090.html
方法详解:http://blog.youkuaiyun.com/shrek_xu/article/details/740991
hibernate对象状态:
瞬时(transient):数据库中没有数据与之对应,超过作用域被jvm垃圾回收器回收,一般是new出来且与session没有关联的对象。
持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;
持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测出来)。
脱管/游离(detached):数据库中有数据与之对应,但当前没有session与之关联(session关闭了),脱管对象状态发生改变,hibernate不能检测到。
衡量对象状态:数据库中有没有数据、与session中有没有关系.
实体对象的三种状态:
瞬时 持久 脱管
瞬时:新建user对象时,此时数据库里没有记录,user会被垃圾回收机制回收。
持久:事务提交前,此时数据库里有记录,而且user变化会和数据库记录变化同步。
脱管:事务提交后,session关闭,此时数据库已有记录,但是user和数据库断开连接,user变化不会影响数据库记录。
这就关系到什么时候调用更新了,在脱管的时候,没办法同步数据库和user,只能调用update方法,而瞬时的时候,必须使用save方法做更新。可以根据Users.hbm.xml中id标签中的unsaved-value属性配置没保存时id的值
可以根据id号有无判断user出于瞬时态还是脱管态,瞬时态时id=0 (int默认),脱管态时id!=0.
saveOrUpdate 和 merge方法区别:
saveOrUpdate方法后user处于持久态
merge方法后user处于脱管态
update执行时间点:
- Session s = null;
- Transaction ts = null;
- try{
- s = HibernateUtil.getSession();
- ts = s.beginTransaction();
- s.save(user);
- user.setName("new name");
- user.setBirthday(new Date());
- ts.commit();
- }finally{
- if(s != null){
- s.close();
- }
update只执行一次,在事物提交时ts.commit();
Hibernate 映射单个自然主键(unsaved-value):
http://blog.sina.com.cn/s/blog_5f43e6510100c9c0.html