hibernate的各种保存方式的区别(save,persist,update,saveOrUpdte,merge,flush,lock) hibernate

引自:http://wj131.iteye.com/blog/320729

 

hibernate 的各种保存方式的区别(save,persist,update,saveOrUpdte,merge,flush,lock)

hibernate 的保存

一、准备知识

对于hibernate ,它的对象有三种状态,transient 、persistent 、detached :

transient :瞬态或者自由态

(new DeptPo(1,” 行政部”,20,” 行政相关”) ,该po 的实例和session 没有关联,该po 的实例处于transient)

persistent :持久化状态

( 和数据库中记录相影射的Po 实例,它的状态是persistent, 通过get 和load 等得到的对象都是persistent)

detached :脱管状态或者游离态

    (1) 当通过get 或load 方法得到的po 对象它们都处于persistent, 但如果执行delete(po) 时( 但不能执行事务), 该po 状态就处于detached, ( 表示和session 脱离关联), 因delete 而变成游离态可以通过save 或saveOrUpdate() 变成持久态

(2) 当把session 关闭时,session 一级缓存中的persistent 的po 对象也变成detached

因关闭session 而变成游离态的可以通过lock 、save 、update 等变成持久态

持久态 实例可以通过调用 delete() 变成脱管状态( 游离态)

通过get() 或load() 方法得到的实例都是持久化状态的。

脱管状态的实例可以通过调用lock() 或者replicate() 进行持久化。

 

save() 和persist() 将会引发SQL 的INSERT ,delete() 会引发SQLDELETE ,

而update() 或merge() 会引发SQL UPDATE 。对持久化(persistent )实例属性的修改在刷新提交的时候会被检测到,它也会引起SQL UPDATE 。

saveOrUpdate() 或者replicate() 会引发SQLINSERT 或者UPDATE

二、save 和update 区别

把这一对放在第一位的原因是因为这一对是最常用的。

save 的作用是把一个新的对象( 自由态) 保存

update 是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库,也就是说把对象(脱管状态的对象自由态对象 )变成持久态

 

三、update 和saveOrUpdate 区别

这个是比较好理解的,顾名思义,saveOrUpdate 基本上就是合成了save 和update, 而update 只是update; 引用hibernate reference 中的一段话来解释他们的使用场合和区别

通常下面的场景会使用update() 或saveOrUpdate() :

程序在第一个session 中加载对象, 接着把session 关闭

该对象被传递到表现层

对象发生了一些改动

该对象被返回到业务逻辑层最终到持久层

程序创建第二session 调用第二个session 的update() 方法持久 这些改动

 

saveOrUpdate(po) 做下面的事:

如果该po 对象已经在本session 中持久化了,在本session 中执行saveOrUpdate 不做任何事

如果savaOrUpdate( 新po) 与本session 中的另一个po 对象拥有相同的标识(identifier) ,抛出一个异常

org.hibernate.NonUniqueObjectException : a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]

saveOrUpdate 如果对象没有持久化标识(identifier) 属性,对其调用save() ,否则update() 这个对象

 

四、persist 和save 区别

这个是最迷离的一对,表面上看起来使用哪个都行,在hibernate reference 文档中也没有明确的区分他们.

这里给出一个明确的区分。(可以跟进src 看一下,虽然实现步骤类似,但是还是有细微的差别)

主要内容区别:

1 ,persist 把一个瞬态的实例持久化,但是并" 不保证" 标识符(identifier 主键对应的属性) 被立刻填入到持久化实例中,标识符的填入可能被推迟到flush 的时候。

2 ,save, 把一个瞬态的实例持久化; 标识符及时的产生, 它要返回标识符,所以它会立即执行Sql insert

 

五、saveOrUpdate,merge 和update 区别

比较update 和merge

update 的作用上边说了,这里说一下merge 的

如果session 中存在相同持久化标识(identifier) 的实例 ,用户给出新的对象( 自由态) 覆盖session 已有的持久实例的属性

(1) 当我们使用update 的时候,执行完成后,会抛出异常

(2) 但当我们使用merge 的时候,把处于自由态的po 对象A 的属性copy 到session 当中处于持久态的po 的 属性中,执行完成后原来是持久状态还是持久态,而我们提供的A 还是自由态

 

六、flush 和update 区别

这两个的区别好理解

update 操作的是在自由态或脱管状态( 因session 的关闭而处于脱管状态) 的对象,

接着会产生update 的SQL 动作

而flush 是操作是持久状态的对象。

默认情况下,一个持久状态的对象的改动(包含set 容器)是不需要update 的,只要你更改了对象的值,等待hibernate flush 就自动更新或保存到数据库了。hibernate flush 发生在以下几种情况中:

1 、手动flush()

2 、transaction commit 的时候(包含了flush )

 

七、lock 和update 区别

Update 是把一个已经更改过 的脱管状态的对象变成持久状态

lock   是把一个没有更改过的脱管状态 的对象变成持久状态( 针对的是因Session 的关闭而处于脱管状态的po 对象,不能针对因delete 而处于脱管状态的po 对象)

update 的操作步骤是:

(1) 属性改动后的脱管的对象的修改-> 调用update

lock 和update 关联:

(2) 调用lock 把未修改的对象从脱管状态 变成持久状态--> 更改持久状态的对象的内容--> 等待flush 或者手动flush

八、clear 和evcit 的区别

    clear 完整的清除session 缓存

   evcit(obj) 把某个持久化对象从session 的缓存中清空。

 

Lock 把游离态的对象变成持久态

ssion.lock(xtyhb,LockMode.NONE);// 表示直接把游离态对象变成持久态的对象

session.lock(xtyhb,LockMode.READ);// 先通过 ID 读数据库该记录的 ID 看是否有该记录,如果有接着才把该游离态对象变成持久态的对象

 

replicate 把游离态的对象变成持久态

session .replicate(cardid, ReplicationMode. IGNORE ); // 忽略复制

session .replicate(cardid, ReplicationMode. OVERWRITE ); // 根据游离态的对象复制一个对象到 session 的一级缓存中 , 实际上是又根据游离态对象产生了一个持久态的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值