会计考友 发表于 2012-8-4 12:44:44

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

 hibernate对于对象的保留供给了太多的体例,他们之间有良多分歧,这里细说一下,以便区别: 一、预告常识:
  在所有之前,声名一下,对于hibernate,它的对象有三种状况,transient、persistent、detached
  下边是常见的翻译法子:
  transient:瞬态或者自由态
  persistent:持久化状况
  detached:脱管状况或者游离态
  脱管状况的实例可以经由过程挪用save()、persist()或者saveOrUpdate()体例进行持久化。
  持久化实例可以经由过程挪用 delete()酿成脱管状况。经由过程get()或load()体例获得的实例都是持久化状况的。
  脱管状况的实例可以经由过程挪用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。
  save()和persist()将会激发SQL的INSERT,delete()会激发SQLDELETE,
  而update()或merge()会激发SQLUPDATE.对持久化(persistent)实例的改削在刷新提交的时辰会被检测到,
  它也会引起SQLUPDATE.saveOrUpdate()或者replicate()会激发SQLINSERT或者UPDATE
二、save 和update区别
  把这一对放在第一位的原因是因为这一对是最常用的。
  save的浸染是把一个新的对象保留
  update是把一个脱管状况的对象保留
  三,update 和saveOrUpdate区别
  这个是斗劲好理解的,顾名思义,saveOrUpdate根基上就是合成了save和update
  引用hibernate reference中的一段话来诠释他们的使用场所和区别
  凡是下面的场景会使用update()或saveOrUpdate():
  轨范在第一个session中加载对象
  该对象被传递到默示层
  对象发生了一些改动
  该对象被返回到营业逻辑层

  轨范挪用第二个session的update()体例持久这些改动

会计考友 发表于 2012-8-4 12:44:45

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

</p>  saveOrUpdate()做下面的事:
  如不美观对象已经在本session中持久化了,不做任何事
  如不美观另一个与本session联系关系的对象拥有不异的持久化标识(identifier),抛出一个异常
  如不美观对象没有持久化标识(identifier)属性,对其挪用save()
  如不美观对象的持久标识(identifier)剖明其是一个新实例化的对象,对其挪用save()
  如不美观对象是附带版本信息的(经由过程或) 而且版本属性的值剖明其是一个新实例化的对象,save()它。
  否则update() 这个对象
四,persist和save区别
  这个是最迷离的一对,概况上看起来使用哪个都行,在hibernate reference文档中也没有明晰的区分他们。
  这里给出一个明晰的区分。(可以跟进src看一下,虽然实现轨范近似,可是仍是有细微的分歧)
  这里参考http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682中的一个声名:
---------------------------------------------------------------------------------
  I found that a lot of people have the same doubt. To help to solve this issue
  I'm quoting Christian Bauer:
  "In case anybody finds this thread……
  persist() is well defined. It makes a transient instance persistent. However,
  it doesn't guarantee that the identifier value will be assigned to the persistent
  instance immediately, the assignment might happen at flush time. The spec doesn't say
  that, which is the problem I have with persist()。
  persist() also guarantees that it will not execute an INSERT statement if it is
  called outside of transaction boundaries. This is useful in long-running conversations
  with an extended Session/persistence context.A method like persist() is required.
  save() does not guarantee the same, it returns an identifier, and if an INSERT
  has to be executed to get the identifier (e.g. "identity" generator, not "sequence"),
  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."

---------------------------------------------------------------------------------

会计考友 发表于 2012-8-4 12:44:46

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

</p>  简单翻译一下上边的句子的首要内容:
  1,persist把一个瞬态的实例持久化,可是并"不保证"标识符被马上填入到持久化实例中,标识符的填入可能被推迟
  到flush的时刻。
  2,persist"保证",当它在一个transaction外部被挪用的时辰并不触发一个Sql Insert,这个功能是很有用的,
  当我们经由过程担任Session/persistence context来封装一个长会话流程的时辰,一个persist这样的函数是需要的。
  3,save"不保证"第2条,它要返回标识符,所以它会当即执行Sql insert,不管是不是在transaction内部仍是外部

五,saveOrUpdateCopy,merge和update区别
  首先声名merge是用来庖代saveOrUpdateCopy的,这个具体见这里
  http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html
  然后斗劲update和merge
  update的浸染上边说了,这里说一下merge的
  如不美观session中存在不异持久化标识(identifier)的实例,用用户给出的对象的状况笼盖旧有的持久实例
  如不美观session没有响应的持久实例,则考试考试年夜数据库中加载,或建树新的持久化实例,最后返回该持久实例
  用户给出的这个对象没有逼爰关系到session上,它依旧是脱管的
  重点是最后一句:
  当我们使用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是把一个没有更悔改的脱管状况的对象酿成持久状况
  对应更改一个记实的内容,两个的操作分歧:
  update的操作轨范是:
  (1)更改脱管的对象->挪用update
  lock的操作轨范是:
  (2)挪用lock把对象年夜脱管状况酿成持久状况——>更改持久状况的对象的内容——>期待flush或者手动flush
页: [1]
查看完整版本: JAVA认证:浅谈Hibernate的各种保存方式的区别