快捷搜索:

Hibernate 对象 三种状态 瞬时态,持久态,脱管态 以

Hibernate的工具有3种状态,分手为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的工具也称为PO(Persistence Object),瞬时工具和脱督工具也称为VO(Value Object)。

瞬时态

由new敕令开辟内存空间的java工具,

eg. Person person = new Person("amigo", "女");

假如没有变量对该工具进行引用,它将被java虚拟机收受接收。

瞬时工具在内存伶仃存在,它是携带信息的载体,反面数据库的数据有任何关联关系,在Hibernate中,可经由过程session的save()或saveOrUpdate()措施将瞬时工具与数据库相关联,并将数据对应的插入数据库中,此时该瞬时工具改变成持久化工具。

持久态

处于该状态的工具在数据库中具有对应的记录,并拥有一个持久化标识。假如是用hibernate的delete()措施,对应的持久工具就变成瞬时工具,因数据库中的对应数据已被删除,该工具不再与数据库的记录关联。

当一个session履行close()或clear()、evict()之后,持久工具变成脱督工具,此时持久工具会变成脱督工具,此时该工具虽然具稀有据库识别值,但它已不在HIbernate持久层的治理之下。

持久工具具有如下特征:

1. 和session实例关联;

2. 在数据库中有与之关联的记录。

脱管态

当与某持久工具关联的session被关闭后,该持久工具转变为脱督工具。当脱督工具被从新关联到session上时,并再次改变成持久工具。

脱督工具拥稀有据库的识别值,可经由过程update()、saveOrUpdate()等措施,改变成持久工具。

脱督工具具有如下特征:

1. 本色上与瞬时工具相同,在没有任何变量引用它时,JVM会在适当的时刻将它收受接收;

2.比瞬时工具多了一个数据库记录标识值。

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

Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的应用

Hibernate的工具有3种状态,分手为:瞬时态(Transient)、 持久态(Persistent)、脱管态(Detached)。处于持久态的工具也称为PO(Persistence Object),瞬时工具和脱督工具也称为VO(Value Object)。

瞬时态

由new敕令开辟内存空间的java工具,

eg. Person person = new Person("xxx", "xx");

假如没有变量对该工具进行引用,它将被java虚拟机收受接收。

瞬时工具在内存伶仃存在,它是携带信息的载体,反面数据库的数据有任何关联关系,在Hibernate中,可经由过程session的save()或saveOrUpdate()措施将瞬时工具与数据库相关联,并将数据对应的插入数据库中,此时该瞬时工具改变成持久化工具。

持久态

处于该状态的工具在数据库中具有对应的记录,并拥有一个持久化标识。假如是用hibernate的delete()措施,对应的持久工具就变成瞬时工具,因数据库中的对应数据已被删除,该工具不再与数据库的记录关联。

当一个session履行close()或clear()、evict()之后,持久工具变成脱督工具,此时持久工具会变成脱督工具,此时该工具虽然具稀有据库识别值,但它已不在HIbernate持久层的治理之下。

持久工具具有如下特征:

1. 和session实例关联;

2. 在数据库中有与之关联的记录。

脱管态

当与某持久工具关联的session被关闭后,该持久工具转变为脱督工具。当脱督工具被从新关联到session上时,并再次改变成持久工具。

脱督工具拥稀有据库的识别值,可经由过程update()、saveOrUpdate()等措施,改变成持久工具。

脱督工具具有如下特征:

1. 本色上与瞬时工具相同,在没有任何变量引用它时,JVM会在适当的时刻将它收受接收;

2.比瞬时工具多了一个数据库记录标识值。

hibernate的各类保存要领的区(save,persist,update,saveOrUpdte,merge,flush,lock)及 工具的三种状态

hibernate的保存

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的关闭而处于脱管状态)的工具//updateSQL

而flush是操作的在持久状态的工具。

默认环境下,一个持久状态的工具的篡改(包孕set容器)是不必要update的,只要你变动了工具的值,等待hibernate flush就自动更新或保存到数据库了。hibernate flush发生在以下几种环境中:

1, 调用某些查询的和手动flush(),session的关闭、SessionFactory关闭结合

get()一个工具,把工具的属性进行改变,把资本关闭。

2,transaction commit的时刻(包孕了flush)

七、lock和update差别

update是把一个已经变动过的脱管状态的工具变成持久状态

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

对应变动一个记录的内容,两个的操作不合:

update的操作步骤是:

(1)属性篡改后的脱管的工具的改动->调用update

lock的操作步骤是:

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

八、clear和evcit的差别

clear完备的清除session缓存

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

您可能还会对下面的文章感兴趣: