Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate save,包括介绍Hibernate saveOrUpdate等方面。
在所有之前,说明一下,对于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
Hibernate save和update区别
把这一对放在***位的原因是因为这一对是最常用的。
◆save的作用是把一个新的对象保存
◆update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库
Hibernate saveOrUpdate和update区别
这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用Hibernate reference中的一段话来解释他们的使用场合和区别
通常下面的场景会使用update()或saveOrUpdate():
◆程序在***个session中加载对象,接着把session关闭
◆该对象被传递到表现层
◆对象发生了一些改动
◆该对象被返回到业务逻辑层最终到持久层
◆程序创建第二session调用第二个session的update()方法持久这些改动
Hibernate 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() 这个对象
Hibernate save和persist区别
这个是最迷离的一对,表面上看起来使用哪个都行,在Hibernate reference文档中也没有明确的区分他们。这里给出一个明确的区分。(可以跟进src看一下,虽然实现步骤类似,但是还是有细微的差别)
主要内容区别:
1,persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。
2,save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert
【编辑推荐】