Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的运用

Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用
当new一个user的时候,是处于瞬时状态
当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态
当提交事务的时候,user对象才会存到DB中
当调用session.close的时候,user对象会从session中出来,此时处于脱管状态

三种状态对象的区别:标准就是与session,与数据库的关系
瞬时状态:与session,数据库无关
持久状态:在session里,在数据库里,当持久化状态对象发生改变的时候,hibernate会检测到
问题一:当调用了session.save(User)后,又调用了user.setName(“张三”),hibernate会自动检测到user对象的变化,问题是,hibernate是何时通知数据库的呢?
答案是,在commit的时候。因为他不会根据程序调用一次set,就同步一次数据库,他会尽可能的减少与数据库就交互,会在commit()之前一次性的同步数据库。
脱管状态:与session无关,但在数据库里有数据。
什么时候用update()?
当对象处于脱管状态的要想更新对象则调用update()、
当对象处于瞬时状态的时候,则调用save()方法
问题是,在写代码的时候,怎么知道状态是处于瞬时和脱管状态呢,一个好的方法是
当不知道对象处于什么状态的时候,调用saveOrUpdate方法,让hibernate自己去判断。那么hibernate是怎么判断的呢,他也是根据对象的id或者Version来判断,当id=0的时候,对象处于瞬时状态。当id>0的时候,对象处于脱管状态。那么如果主键是String类型呢,则他会根据是否为Null来判断

三种状态的转变及调用什么方法可以转变?

通过new可以创建一个瞬时状态的对象
通过save()或者saveOrUpdate()把瞬时状态变成持久化状态
通过delete()方法把持久化状态变成瞬时状态
通过evict()/close()/clear()把持久化状态变成脱管状态
通过update()/savaOrUpdate()/lock()方法把脱管状态变成持久化状态
通过get()或者load()或者find()或者iterate()等都能取得持久化状态的对象
理解这几种状态的含义及使用,是非常有用的,只有明白了,在开发中才知道什么时候用什么方法。
1 楼 zeng1990 2011-11-28  
解释的蛮清楚的,收下了。