</p> 简单翻译一下上边的句子的首要内容:$ O. | |0 K9 }3 U
1,persist把一个瞬态的实例持久化,可是并"不保证"标识符被马上填入到持久化实例中,标识符的填入可能被推迟
: V) n* N( j6 J" l0 k 到flush的时刻。' N6 v% M5 x" D! J9 S4 A+ ^# h
2,persist"保证",当它在一个transaction外部被挪用的时辰并不触发一个Sql Insert,这个功能是很有用的,- N# b% Y7 z4 m; U1 `9 P0 F2 R
当我们经由过程担任Session/persistence context来封装一个长会话流程的时辰,一个persist这样的函数是需要的。
1 V7 x, n4 J$ z2 v 3,save"不保证"第2条,它要返回标识符,所以它会当即执行Sql insert,不管是不是在transaction内部仍是外部
# f9 X$ z" ~0 Q$ ^% p; L! ~1 G3 [9 o, X+ y! t3 i
五,saveOrUpdateCopy,merge和update区别 & i5 n/ f6 t3 t. _ I7 q
首先声名merge是用来庖代saveOrUpdateCopy的,这个具体见这里
8 u: \6 `5 H" {# E; _* F, A2 U http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html
- r9 |) w4 L, M% }" h 然后斗劲update和merge
' j( B8 \# e& Z% `) ^* e. v# j2 ] update的浸染上边说了,这里说一下merge的
" k5 s: J6 v( R 如不美观session中存在不异持久化标识(identifier)的实例,用用户给出的对象的状况笼盖旧有的持久实例
; n& E- Y8 i9 g. c" e0 y 如不美观session没有响应的持久实例,则考试考试年夜数据库中加载,或建树新的持久化实例,最后返回该持久实例
, k% ?9 {+ @) Y: w; Z7 N o7 H 用户给出的这个对象没有逼爰关系到session上,它依旧是脱管的# y2 r! P/ [2 N. j$ c$ ]3 Q
重点是最后一句:' b/ [& ]$ V8 [ ?) m3 A) [3 `
当我们使用update的时辰,执行完成后,我们供给的对象A的状况酿成持久化状况5 w% R; C5 L% M4 u" C$ t
但当我们使用merge的时辰,执行完成,我们供给的对象A仍是脱管状况,hibernate或者new了一个B,或者检索到
# l+ O+ @ s$ Y# V2 }' [* A" L 一个持久对象B,并把我们供给的对象A的所有的值拷贝到这个B,执行完成后B是持久状况,而我们供给的A仍是托管状况
# A b; C m. H6 @4 W6 Y/ |六,flush和update区别
4 \, K8 q( c* S: v; X' V 这两个的区别好理解- K% d0 j- {" R6 {) z4 n
update操作的是在脱管状况的对象
' D) v3 _+ q! B! h$ B 而flush是操作的在持久状况的对象。. E( k9 W& U8 V. z9 l
默认情形下,一个持久状况的对象是不需要update的,只要你更改了对象的值,期待hibernate flush就自动保留到数据库了。hibernate flush发生再几种情形下: 1,挪用某些发芽的时辰, s9 v7 f& V7 h/ d
2,transaction commit的时辰8 I/ t7 x6 R7 g# p% S, L, N, p
3,手动挪用flush的时辰
' i2 M1 r% _- o' g" y 七,lock和update区别
$ P6 L/ p- U6 @. B% X* H update是把一个已经更悔改的脱管状况的对象酿成持久状况- w- L! ]. @* s0 A9 N
lock是把一个没有更悔改的脱管状况的对象酿成持久状况+ @* n: |7 ?/ j' j
对应更改一个记实的内容,两个的操作分歧:
* Y1 v3 K6 K# B7 A u update的操作轨范是:
, Q1 N' j0 p0 S9 T (1)更改脱管的对象->挪用update4 v& ?0 E$ g! H) H
lock的操作轨范是:8 O: n- S1 R0 q
(2)挪用lock把对象年夜脱管状况酿成持久状况——>更改持久状况的对象的内容——>期待flush或者手动flush |