Hibernate之即时更新

  昨天工作中遇到了一个简单的问题,弄了好久,都怪自己没有好好的去了解hibernate,导致了这样的问题弄了两三个小时。

  问题是这样的:我想即时更改数据,然后再查询

(1)用Spring的getHibernateTemplate.update来更新,

(2)然后用this.getHibernateTemplate().getSessionFactory().getCurrentSession().createSQLQuery(select * ).addScalar.....查询。

我以为步骤(1)会更新到数据库。然而查询出来的数据一直不对。我以为是我的逻辑错误导致了数据的不正确,后来调试发现是由于数据根本

没有更新到数据库。

我上网搜索发现原因如下:

    Hibernate缓存分为二级,第一级存放于session中称为一级缓存,默认带有且不能卸载。

  第二级是由sessionFactory控制的进程级缓存。是全局共享的缓存,凡是会调用二级缓存的查询方法都会从中受益。只有经正确的配置后二级缓存才会发挥作用。同时在进行条件查询时必须使用相应的方法才能从缓存中获取数据。比如Query.iterate()方法、load、get方法等。必须注意的是session.find方法永远是从数据库中获取数据,不会从二级缓存中获取数据,即便其中有其所需要的数据也是如此。

参考:http://blog.csdn.net/woshichenxu/article/details/586361

时间: 2024-10-12 16:28:41

Hibernate之即时更新的相关文章

android 实现类似微信缓存和即时更新好友头像

引言 使用微信时我们会发现,首次进入微信的好友列表时,会加载好友头像,但是再次进入时,就不用重新加载了,而且其他页面都不用重新加载,说明微信的好友头像是缓存在本地的,然后好友修改头像后,又会及时的更新,这个功能是如何实现的呢,我们来分析一下 分析 关于头像缓存的实现 头像是网络图片,而且数据量较大,如果用我们常用的SharedPreferences将头像以Bitmap的形式存储,势必会造成OOM,这个方法是行不通的,我们存储的只能是图片的地址,但是如果只存储地址的话,要转化成图片,还是要通过网络

asp.net中Winform开发框架之数据即时更新的实现

在开篇之前,首先介绍一下Winform开发框架中的界面层的继承关系,首先我把所有窗体区分为三类,一类是普通的窗体,一类编辑窗体,还有一类是列表显示窗体.窗体的集成可以封装处理很多东西,良好的封装和继承,可以为我们提高效率,减少重复代码,它的作用不再在此讨论和强调. 采用窗体继承,极大程度上统一了界面,并且对常用的界面操作,提供了良好的封装,如基础数据编辑.新增窗体积累封装了对回车.方向键.数据刷新.异常处理.数据检查.数据保存.数据更新等接口,为窗体的数据处理提供了很大的方便性.而数据查询显示窗

DSR 系统开发记录(2014年7月25日):Hibernate User Type 更新操作

今天遇到的问题是在 VisitRecord 编辑保存之后,MedicineComment 中的 Medicine 属性就变成 null 了.经过简单的调查之后发现,在做更新操作时,起作用的并不是 UserType 的 nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) 方法,而是 Object replace(Object original, Object target, O

BIT祝威博客汇总(即时更新)

目测我已经写了好几十篇博文,再这样下去就不好找了.因此将此汇总帖置顶,并即时更新,以方便查找(Ctrl+F即可). 带有“”是我觉得可以见人的,推荐大家(也包括我)没事看看,温故知新. 关于硬件 <穿越计算机的迷雾>笔记 继电器是如何成为CPU的(1) 继电器是如何成为CPU的(2) 关于操作系统 <30天自制操作系统>笔记(01)——hello bitzhuwei’s OS! <30天自制操作系统>笔记(02)——导入C语言 <30天自制操作系统>笔记(0

两个文本框异动任何一个能即时更新计算结果

在GridView控件中,有两个文本框,用户更改某一个文本框的值,能即时计算结果.Insus.NET列举一个小例子,来演示些功能.先创建一个对象(类): 在网页中,创建一个集合,假设说,一张采购单有多个物品组件,这样说,采购单就是一个集合,不过些例,只是采购一个物品. 把上面的集合,绑定给GridView数据控件,绑定前,先写Html markup,下划线的部分就是重点部位. 开始在cs绑定数据给GridView控件: 下面来写写OnRowCreated="GridViewPO_RowCreat

使用Hibernate框架来更新对象的注意事项

Hibernate在更新对象的时候,如果对象的有些属性没有设置,那么在更新的时候,会被默认为空. 特别在更新表单对象的时候. 例子: 如: Department部门类 该部门类有以下属性: id : Long name : String (注:部门名称) description : String  (注:部门说明) parent : Department  (注:上级部门) children : Set<Department> (注:下级部门) 修改页面表单: 除了children属性没有提供

hibernate的update() 更新延迟或者无法更新,导致同个service调用存储过程执行方法不精确

hibernate的update()方法无法更新,不报错 原因是hibernate的update方法操作的是缓存,可以flush下先. 设置缓存为false理论上也可. 在一个serivce方法里,执行一个update操作,更新数据的状态,再调用存储过程对数据统计, 却一直统计不精确,因为每次都是存储过程先执行,后service方法执行完毕,才执行update操作, 针对此种情况,可以在执行update操作后,执行flush操作,让更新立即实现

hibernate获取实体更新前的值

在使用hibernat的时候有时需要获取实体在更新前的某个字段的值,但hibernate没有提供公开的api来获取,如果使用session的get方法或用hql获取始终只能获取到更新后的值(我说的是在同一个会话当中,如果你另启一个会话来获取的话当我没说),如果想要获取更新前的值只能拼sql,然后用jdbc来获取,但在研究hibernate的拦截器时候,发现在onFlushDirty中可以获取到更新前的值,如下: public boolean onFlushDirty(Object entity,

hibernate 在做更新和删除的时候一定要把事务开启

在做更新和删除的时候一定要把事务开启 在做更新和删除的时候一定要把事务开启 在做更新和删除的时候一定要把事务开启 重要的事情说三遍!!! curd之前配置文件 <property name="hbm2ddl.auto">update</property> 练习hibernate的CURD(单表操作 save& update& delete& get/load )时,发现update&  delete方法执行不成功,冥思苦想也没想出