首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Hibernate获取当前Session,Hibernate清空当前Session的缓存

每次update时,都要记录更新了什么字段,由什么值更新为什么值。所以使用的是Aop,在@around方法中,joinPoint.proceed()之前,运用方法的反射查询下数据库得到objectOld;joinPoint.proceed()之后,再运用方法反射查询下数据库得到objectNew。但是,因为每次update之前都会get一个model,因为get()方法得到的是 持久化状态 。所以这样就不容易得到update之前的值。我的做法是,在joinPoint.proceed()之前,运用方法的反射查询下数据库得到objectNew,因为此时对model的修改,已经跟进到了持久化状态;然后执行evict()方法,将objectNew转换到游离状态;然后再运用方法反射查询下数据库得到objectOld,再执行evict()将objectOld转换到游离状态。不然的话,会报同一个session里包含两个同一标识的不同model的异常。

01

day30_Hibernate复习_02(补刀)

对象的三种状态:     瞬时态:对象刚刚创建,没有与session关联,没有ID     持久态:已经和Session关联,有ID     游离态:没有和session关联,有ID     瞬时=>持久   save/persist     瞬时=>游离   setId     持久=>游离   close/evict/clear     持久=>瞬时   close/evict/clear 再 将ID设置为null     游离=>瞬时   将ID设置为null     游离=>持久   update/saveOrUpdate 持久状态的特性:持久对象的所有变化,会被自动同步到数据库中。 一级缓存:     Hibernate中有两种缓存:线程级别的session缓存 和 进程级别的sessionFactory缓存(不久就会学到啦)   在Session对象中,有一个缓存。 本质:Map集合、键是ID、值是对象,Hibernate会把所有查询到的对象,放入缓存中。         如果再次查询相同的对象,会先从缓存中找。目的:为了提高效率。 快照:快照是为了对比缓存中的对象是否发生变化,来决定事务提交时,是否需要修改数据。 其他api:     evict();    将缓存中的对象移除     clear();    清空一级缓存     refresh(Object);    刷新 => 强制刷新缓存中的对象 => (可以用来解决缓存与数据库数据不同步的问题(局部解决))     flush();    对比快照,并提交缓存对象     saveOrUpdate(Object);    可以同时完成保存或更新操作     save/persist     HQL/SQL/Criteria与缓存的关系 => 查询到的对象会放入缓存中,但是每次查询都要发送sql语句。

02

Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?

Hibernate的对象有三种状态:瞬时态(transient)、持久态(persistent)和游离态(detached),如第135题中的图所示。瞬时态的实例可以通过调用save()、persist()或者saveOrUpdate()方法变成持久态;游离态的实例可以通过调用 update()、saveOrUpdate()、lock()或者replicate()变成持久态。save()和persist()将会引发SQL的INSERT语句,而update()或merge()会引发UPDATE语句。save()和update()的区别在于一个是将瞬时态对象变成持久态,一个是将游离态对象变为持久态。merge()方法可以完成save()和update()方法的功能,它的意图是将新的状态合并到已有的持久化对象上或创建新的持久化对象。对于persist()方法,按照官方文档的说明:① persist()方法把一个瞬时态的实例持久化,但是并不保证标识符被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时间;② persist()方法保证当它在一个事务外部被调用的时候并不触发一个INSERT语句,当需要封装一个长会话流程的时候,persist()方法是很有必要的;③ save()方法不保证第②条,它要返回标识符,所以它会立即执行INSERT语句,不管是在事务内部还是外部。至于lock()方法和update()方法的区别,update()方法是把一个已经更改过的脱管状态的对象变成持久状态;lock()方法是把一个没有更改过的脱管状态的对象变成持久状态。

03

day30_Hibernate复习_02

对象的三种状态:     瞬时状态:没有ID,不在Session缓存中     持久状态:有ID,在Session缓存中     游离状态:有ID,不再Session缓存中 特性:持久状态的对象,会自动将对象的变化同步到数据库中。 一级缓存:     是线程级别的缓存,在Session对象中。     本质:Map集合。     缓存的内容:对象。     目的:减少sql语句发送,提高效率。 快照:在事务提交之前,先对比快照与缓存中的对象,来决定是否需要更新数据库。 细节:save和persist的区别?     HQL、SQL、Criteria查询与缓存的关系 其他api:     evict(); 将缓存中的对象移除     clear(); 清空一级缓存     refresh(Object); 刷新 => 强制刷新缓存中的对象 => (可以用来解决缓存与数据库数据不同步的问题(局部解决))     flush(); 对比快照,并提交缓存对象     saveOrUpdate(Object); 可以同时完成保存或更新操作

01

家装O2O上演“三国乱战”,哪种创业者才是最后的赢家?

文|孟永辉 体量巨大的家装O2O市场历来都是众多创业者们竞逐的焦点。同其他行业不同,真正进入家装O2O市场的创业者并不多,家装行业的专业性和与市场规模匹配的大投入让很多初始的创业者们望而却步。市场虽大,真正能够进入消费者视野的却很少。 根据中国建筑装饰行业的最新数据表明,2015年,我国的家装市场容量有望突破四万亿元的规模,未来还有进一步扩大的态势。同庞大的市场容量形成鲜明对比的是,家装O2O市场的真正参与者很少,真正耳熟能详的家装O2O企业更是少之又少。以资讯为代表的土巴兔,以团购为代表的齐家网,以参与

09

首款采用EOS“黑洞”公钥的星际探索博弈游戏「ITE」即将开战

自从Fomo3D在国内火爆后,市场上马上出现很多仿制版Dapp游戏,特别是最近闹的挺大动静的EOS版狼人杀,因为很多玩家被坑骗了,刚上线就遭遇攻击,被盗取60686.4190个EOS,运营仅2天的EOS狼人杀游戏宣告结束,刚开始大家都以为是一个平常被盗的事情,但后来很多人发现这是一场自导自演的骗局,一开始喊单这个游戏的大V"奶王"王梓岑与官方深层勾结,利用这款“狼人杀”游戏支配着过高权限,最终,账户名为dayafterday2的玩家成为冠军,很多网友一致认为是项目方通过暗箱操作提前结束了游戏,这位“玩家”其实是项目方“诈骗”了4万余个EOS...

02
领券