Hibernate中不同状态对象间的转化及常用方法的区别
三种对象状态
(1)自由状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。
(2)持久化实例可以通过调用 delete()变成脱管状态。
通过get()或load()方法得到的实例都是持久化状态的。
(3)脱管状态的实例可以通过调用 update()、saveOrUpdate()、lock()或者replicate()进行持久化。
与SQL的对应
save()和persist()将会引发SQL的INSERT,
delete()会引发SQL的DELETE,
而update()或merge()会引发SQL的UPDATE。
对持久化实例的修改在刷新提交的时候会被检测到,也会引起SQL的UPDATE。
saveOrUpdate()或者replicate()会引发SQL的INSERT或者UPDATE
save 和update区别
save的作用是把一个新的对象保存
update是把一个脱管状态的对象保存
persist和save区别
save会立即执行Sql insert,不管是在transaction内部还是外部
persist在一个transaction外部被调用的时候并不触发一个Sql Insert
update和merge区别
当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态
但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到
一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态
flush和update区别
update操作的是在脱管状态的对象,
而flush是操作的在持久状态的对象。
默认情况下,一个持久状态的对象是不需要update的,只要你更改了对象的值,等待hibernate flush就自动保存到数据库了。
hibernate flush发生在几种情况下:
1,调用某些查询的时候
2,transaction commit的时候
3,手动调用flush的时候
lock和update区别
update是把一个已经更改过的脱管状态的对象变成持久状态
lock是把一个没有更改过的脱管状态的对象变成持久状态
对应更改一个记录的内容,两个的操作不同:
(1)update的操作步骤是:
更改脱管的对象->调用update
(2)lock的操作步骤是:
调用lock把对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush
参考http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html