jpa和hibernate的区别evict方法和clear方法的区别

Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free.
what is difference between session.clear and evict methods in hibernate.Both are detatched objects that is instance removed from session.when should i use session.clear and session.evict in hibernate.
evicts a single object from the session.
evicts all the objects in the session. Calling clear() is like calling evict() on every object associated with the session.
59.1k10100135
Did this answer by Ryan Stewart help you? It's easy to give back.
to get started.
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you're looking for?
Browse other questions tagged
Stack Overflow works best with JavaScript enabled3553人阅读
&hibernate的保存
hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别。
一、预备知识
在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient、persistent、detached
下边是常见的翻译办法:
transient:瞬态或者自由态
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
总结一下方法执行后, 实体对象的状态会发生什么变化? 先看看这些方法中,从javadoc的注释可以得出:
临时 && 持久&save,persist,saveOrUpdate&托管 && 持久&update,saveOrUpdate,saveOrUpdateCopy , merge,lock,replicate,refresh&持久 && 托管&evict&持久 && 临时&delete&
二、save 和update区别
把这一对放在第一位的原因是因为这一对是最常用的。
save的作用是把一个新的对象保存
update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库
三、update 和saveOrUpdate区别
这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和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的时候。
把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行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的缓存中清空。
1. save和perisit 几乎一样,都是持久化一个临时对象;
只是persist持久化的时间可能推迟到flunsh之前,而且perisit传入的对象为托管对象时,会报错,而save托管对象不会报错只是将id置null。
可以看出,在持久化一个临时对象时,只用save就行了。 2. saveOrUpdate和merge
saveOrUpdate将unsaved对象持久化或托管对象持久化;
merge,从名字也能猜到是合并,跟saveOrUpdate相似,可以持久化托管和临时对象。
不同的是:在更新时候,merge将托管对象的属性复制到session中有相同标识符(但不相等)的持久对象(如果不存在,就从db
load),也就是先select 后
update;倘若找不到相同标识符的对象,则置id为null,保存临时对象。返回的是持久对象,但是merge传入的对象还是托管的。
可以看出,只有在session中已经存在一个具有相同标识符的持久对象的时候,应该采用merge,此时用saveOrUpdate会报错。当然如果碰到这类情形,将对象属性copy到已经持久化的那个相同标识符对象上也是可以的,正因为如此我一般都没用过merge。再者merge在session中不存在相同标识对象时,会多一条select,往往我们并不需要。
3. merge和replicate
replicate,通过复制来持久化当前已经脱离session的托管对象,这点上看有点像merge,但是当传入一个临时对象则会报错,而且replicate后的传入的那个对象将是持久的,这也是跟merge不同。
通过参数ReplicationMode可以控制遇到相同记录时的行为。 如果是
ReplicationMode.EXCEPTION,则在复制时如果有重复的行数据,则抛出异常。ReplicationMode.IGNORE则忽略 异常。
ReplicationMode.OVERWRITE则会覆盖掉已有行数据。ReplicationMode.LATEST_VERSION则是在有重复时使用最新的版本进行控制。
可以看出,replicate在执行复制的时候,比起merge还是有更多可控行为,ReplicationMode.LATEST_VERSION还可以保证并发修改时只更新最新的版本。
4. lock和refresh 相类似的,都将托管对象又重新持久化,而且可以指定查询时候的锁: *
当用户显式的使用数据库支持的SQL格式SELECT ... FOR UPDATE 发送SQL的时候,锁定级别设置为LockMode.UPGRADE *
当用户显式的使用Oracle数据库的SQL语句SELECT ... FOR UPDATE NOWAIT
的时候,锁定级别设置LockMode.UPGRADE_NOWAIT
*当Hibernate在&可重复读&或者是&序列化&数据库隔离级别下读取数据的时候,锁定模式
自动设置为LockMode.READ。这种模式也可以通过用户显式指定进行设置。 *LockMode.NONE
代表无需锁定。在Transaction结束时, 所有的对象都切换到该模式上来。与session相关联的对象通过调用update()
或者saveOrUpdate()脱离该模式。 以上只有 LockMode.NONE,先从缓存查找持久对象;其他的都直接从数据库查找。
有些不同的是,lock还有检查对象版本的能力,如果指定的锁定模式是READ, UPGRADE 或
UPGRADE_NOWAIT,那么Session.lock()就 执行版本号检查。
refresh提供了比load更方便的查找能力,一个刚脱离了session的持久对象,如果用load还需要用id查找,那么refresh就可以直接传入托管对象刷新其状态了。
5. delete和evict
evict,从session的缓存中去除当前实例。执行后对象的改变将不再和数据库保持同步。当指定级联风格为'evict&时,会级联操作关联对象。在用于批量操作的时候,清空缓存,防止内存紧张。
delete,也会从session的缓存中去除当前实例,但flunsh时会执行数据库delete,之后对象就成了临时状态。
可以看出delete比起evict,不仅从session删除,还会从数据库删除。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:40443次
排名:千里之外
转载:16篇
(1)(1)(2)(2)(3)(10)Hibernate的evict方法和clear方法的区别 - izumi - 博客园
趁还没忘掉,赶快记录下来
摘自百度知道:/question/.html问:先创建一个Student,然后调用session.save方法,然后再调用evict方法把Student对象清除出缓存,再提交事务, 可是会报错:Exception in thread "main" org.hibernate.AssertionFailure: possible nonthreadsafe access to session 但是如果我用的不是evict方法,而是clear方法用来清除缓存的话,程序没有错。 答:session.evict(obj),会把指定的缓冲对象进行清除session.clear(),把缓冲区内的全部对象清除,但不包括操作中的对象所以,hibernate执行的顺序如下,(1)生成一个事务的对象,并标记当前的Session处于事务状态(注:此时并未启动数据库级事务)。 (2)应用使用s.save保存对象,这个时候Session将这个对象放入entityEntries,用来标记对象已经和当前的会话建立了关联,由于应用对对象做了保存的操作,Session还要在insertions中登记应用的这个插入行为(行为包括:对象引用、对象id、Session、持久化处理类)。(3)s.evict将对象从s会话中拆离,这时s会从entityEntries中将这个对象移出。(4)事务提交,需要将所有缓存flush入数据库,Session启动一个事务,并按照insert,update,……,delete的顺序提交所有之前登记的操作(注意:所有insert执行完毕后才会执行update,这里的特殊处理也可能会将你的程序搞得一团糟,如需要控制操作的执行顺序,要善于使用flush),现在对象不在entityEntries中,但在执行insert的行为时只需要访问insertions就足够了,所以此时不会有任何的异常。异常出现在插入后通知Session该对象已经插入完毕这个步骤上,这个步骤中需要将entityEntries中对象的existsInDatabase标志置为true,由于对象并不存在于entityEntries中,此时Hibernate就认为insertions和entityEntries可能因为线程安全的问题产生了不同步(也不知道Hibernate的开发者是否考虑到例子中的处理方式,如果没有的话,这也许算是一个bug吧),于是一个net.sf.hibernate.AssertionFailure就被抛出,程序终止一般错误的认为s.save会立即的执行,而将对象过早的与Session拆离,造成了Session的insertions和entityEntries中内容的不同步。所以我们在做此类操作时一定要清楚Hibernate什么时候会将数据flush入数据库,在未flush之前不要将已进行操作的对象从Session上拆离。解决办法是在save之后,添加session.flush。
随笔 - 183Hibernate试验_03_18-19.清楚缓存对象clear_evict_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
Hibernate试验_03_18-19.清楚缓存对象clear_evict
H​i​b​e​r​n​a​t​e​试​验​_3​_8​-9​.​清​楚​缓​存​对​象​c​l​e​a​r​_​e​v​i​c​t
阅读已结束,如果下载本文需要使用
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
你可能喜欢您所在的位置: &
Hibernate的三个状态 所有方法清单
Hibernate的三个状态 所有方法清单
本篇文章列表说明了Hibernate状态中的各种方法。
以下列表给出了Hibernate状态中的各种方法,以供参考。
()开始一个工作单元并且返回相关联的事务(Transaction)对象。
()终止执行当前查询。
()完整的清除这个session。
()停止这个Session,通过中断JDBC连接并且清空(cleaning up)它。
()获取这个Session的JDBC连接。如果这个session使用了积极的collection释放策略(如CMT-容器控制事务的环境下),关闭这个调用的连接的职责应该由当前应用程序负责。
( object)检查这个对象实例是否与当前的Session关联(即是否为Persistent状态)。
( persistentClass)为给定的实体类或它的超类创建一个新的Criteria实例。
( persistentClass,
alias)根据给定的实体类或者它的超类创建一个新的Criteria实例,并赋予它(实体类)一个别名。
( entityName)根据给定的实体的名称(name),创建一个新的Criteria实例。
( entityName,
alias)根据给定的实体的名称(name),创建一个新的Criteria实例,并赋予它(实体类)一个别名
( collection,
queryString)根据给定的collection和过滤字符串(查询条件)创建一个新的Query实例。
( queryString)根据给定的HQL查询条件创建一个新的Query实例。
( queryString)根据给定的SQL查询条件创建一个新的SQLQuery实例。
( object)从数据库中移除持久化(persistent)对象的实例。
( entityName,
object)从数据库中移除持久化(persistent)对象的实例。
( filterName)禁用当前session的名称过滤器。
()断开Session与当前的JDBC连接。
( filterName)打开当前session的名称过滤器。
( object)将当前对象实例从session缓存中清除。
()强制提交清理(flush)Session。
id)根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null。
lockMode)根据给定标识和实体类返回持久化对象的实例,如果没有符合条件的持久化对象实例则返回null。
( entityName,
id)返回与给定的实体命名和标识匹配的持久化实例,如果没有对应的持久化实例则返回null。
( entityName,
lockMode)返回与给定的实体类和标识所匹配的持久化实例,如果没有对应的持久化实例则返回null。
()得到当前的缓存模式。
( object)检测给定对象当前的锁定级别。
( filterName)根据名称获取一个当前允许的过滤器(filter)。
()获取这个session有效的实体模式。
( object)返回一个持久化对象的实体名称。
()获得当前的刷新提交(flush)模式。
( object)获取给定的实体对象实例在Session的缓存中的标识,如果该实例是自由状态(Transient)的或者与其它Session关联则抛出一个异常。
( queryName)从映射文件中根据给定的查询的名称字符串获取一个Query(查询)实例。
( entityMode)根据给定的实体模式(Entity Mode)开始一个新的有效的Session。
()获取创建这个session的SessionFactory实例。
()获取这个session的统计信息。
()获取与这个session关联的Transaction(事务)实例。 instance associated with this session.
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
Angular.js 是一个MV*(Model-View-Whatever,不管是MVC或者MVVM
再过一次生日,我就满七十岁了。而且正如大家印象中一样,像我这个年纪的...
数据结构课程,貌似是大学计算机、网络、软件等专业的
JavaScript正凭借新型工具与功能提升以极度夸张的速度
国庆假期前的612,是不是有点折腾?网上的中秋国庆放
本书是为北大燕工教育研究院编写的计算机网络技术的学习教材。它以实际教学大纲为依据,全面系统的介绍了计算机网络技术知识
51CTO旗下网站

我要回帖

更多关于 hibernate evict 的文章

 

随机推荐