a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 180|回复: 2

[专业语言] JAVA认证:浅谈Hibernate的各种保存方式的区别

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
 hibernate对于对象的保留供给了太多的体例,他们之间有良多分歧,这里细说一下,以便区别: 一、预告常识: - Q4 b* j3 v5 @
  在所有之前,声名一下,对于hibernate,它的对象有三种状况,transient、persistent、detached
- b3 j9 Y6 R' `5 o! s  Y  下边是常见的翻译法子:
+ W2 U" P  m  |: P! Z  transient:瞬态或者自由态/ A: i( _# }5 Q. U; F1 M
  persistent:持久化状况
" [% X; X( C% `3 y9 w4 X% M  detached:脱管状况或者游离态* v; ^2 _6 i2 M% d1 w
  脱管状况的实例可以经由过程挪用save()、persist()或者saveOrUpdate()体例进行持久化。
  P- n' n; @6 C( W$ u  持久化实例可以经由过程挪用 delete()酿成脱管状况。经由过程get()或load()体例获得的实例都是持久化状况的。) B  t  D7 b1 q) v( A# q2 e
  脱管状况的实例可以经由过程挪用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。4 _* B& d; a% |! j$ m
  save()和persist()将会激发SQL的INSERT,delete()会激发SQLDELETE,
* P+ e5 Y  F, Q4 ~& ]  而update()或merge()会激发SQLUPDATE.对持久化(persistent)实例的改削在刷新提交的时辰会被检测到,5 L, U* D1 [0 H4 ?9 \2 ~
  它也会引起SQLUPDATE.saveOrUpdate()或者replicate()会激发SQLINSERT或者UPDATE7 [' }( p6 W5 l+ n; ]- y1 N
二、save 和update区别 6 F: Y$ W2 A" d! G- W4 g
  把这一对放在第一位的原因是因为这一对是最常用的。: k' {2 d/ [# Q6 v
  save的浸染是把一个新的对象保留& y; s( f5 ^6 c$ h+ h  [1 }2 ]* @
  update是把一个脱管状况的对象保留0 u  \/ v8 [( O5 e$ b% Y
  三,update 和saveOrUpdate区别, W8 D) y9 Q. j: a
  这个是斗劲好理解的,顾名思义,saveOrUpdate根基上就是合成了save和update
0 y8 {% C' |, ^) d  i  引用hibernate reference中的一段话来诠释他们的使用场所和区别4 z5 N$ `0 H  O! f
  凡是下面的场景会使用update()或saveOrUpdate():
+ k: l$ s0 W: F1 _" r, m  轨范在第一个session中加载对象% M$ e: @' G8 Z6 D: g
  该对象被传递到默示层8 a) N5 N2 Z- g" r' h, J3 V
  对象发生了一些改动
& C5 t2 S/ H+ y1 x( k5 Z+ ~+ E5 }  该对象被返回到营业逻辑层4 V) V9 `0 m8 ~* n- o5 x/ W* }
$ _$ K- }' R$ a/ S( N
  轨范挪用第二个session的update()体例持久这些改动
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:45 | 显示全部楼层

JAVA认证:浅谈Hibernate的各种保存方式的区别

</p>  saveOrUpdate()做下面的事:
9 T6 G$ U- i- u) I' O8 X& f  如不美观对象已经在本session中持久化了,不做任何事
; O' S( \% u  ]% w( Q6 `: c+ z- s  如不美观另一个与本session联系关系的对象拥有不异的持久化标识(identifier),抛出一个异常
5 E/ O" \, y! h% D  如不美观对象没有持久化标识(identifier)属性,对其挪用save()$ w5 h4 _% j7 E
  如不美观对象的持久标识(identifier)剖明其是一个新实例化的对象,对其挪用save()
# W2 m; [4 e- A, O5 Y  R+ n  如不美观对象是附带版本信息的(经由过程或) 而且版本属性的值剖明其是一个新实例化的对象,save()它。+ c5 Y. g$ L. X3 S8 v
  否则update() 这个对象7 g- m0 ]$ A# H! Z7 T  z9 `
四,persist和save区别 3 R, c" U& H9 E, g/ G( h
  这个是最迷离的一对,概况上看起来使用哪个都行,在hibernate reference文档中也没有明晰的区分他们。
" G6 M; G& V+ p+ o  这里给出一个明晰的区分。(可以跟进src看一下,虽然实现轨范近似,可是仍是有细微的分歧)" \) q' f& }3 I7 @1 o. L
  这里参考http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682中的一个声名:
5 S) H# k7 E6 ?; f  H. @/ l---------------------------------------------------------------------------------; ?5 P" Q8 q6 A* y" M8 ?
  I found that a lot of people have the same doubt. To help to solve this issue
% b7 a3 B' p; Q0 `# u  I'm quoting Christian Bauer:( a/ a" {# {! v7 |- b9 B2 u* O
  "In case anybody finds this thread……& }+ j1 x4 Y. p* S3 y
  persist() is well defined. It makes a transient instance persistent. However,
' s4 S& P: G) p  I  it doesn't guarantee that the identifier value will be assigned to the persistent
2 T' L* Q, e4 V' ^( e  instance immediately, the assignment might happen at flush time. The spec doesn't say  p4 Z. Z/ @' e$ g" A/ [* \
  that, which is the problem I have with persist()。7 w; W: k* o6 E$ K- ~
  persist() also guarantees that it will not execute an INSERT statement if it is& T* X; k; X* E( W7 Q6 n
  called outside of transaction boundaries. This is useful in long-running conversations
" g$ E; k: U* E# b  with an extended Session/persistence context.A method like persist() is required.
: _+ k' i8 q9 h& Q  e! G6 W  save() does not guarantee the same, it returns an identifier, and if an INSERT
& |7 E9 c' S8 x7 R7 `: Q, f  has to be executed to get the identifier (e.g. "identity" generator, not "sequence"),
6 u! `5 W' Y, |# G2 V6 L0 ^  this INSERT happens immediately, no matter if you are inside or outside of a transaction. This is not good in a long-running conversation with an extended Session/persistence context."+ q; z' ~2 v. j5 T2 _

+ L" V' d) E( ^' J% U. [---------------------------------------------------------------------------------
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:46 | 显示全部楼层

JAVA认证:浅谈Hibernate的各种保存方式的区别

</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
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-29 22:03 , Processed in 0.209496 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表