日期:2014-05-16  浏览次数:20469 次

偶在项目中用hibernate居然从能清空了的数据库里查询到数据?
本人在为公司的一个大客户做web ordering系统,其中遇到了一些hibernate的问题,蛮有意思的,虽然我已经用别的方法解决,但对存在的问题一直没有根本的理解,放在这里来,跟大家一起分享一下,能解决就解决,不能解决的就给别人当个提醒,绕开这个错误
环境:tomcat+mysql
问题一:
清空数据库后还能查询到数据
对一个数据库里的4个表,每个表有10000+条数据,直接用JDBC来一次性全部删除(爽啊),从数据库里查询也是已经清空了,连auto_increment也重置为0了,但奇怪的是,在接着的导入模块里,用hibernate的session.get(class,pkid)还是能查询到删除的数据,晕死了,4个表加起来是4W多条数据啊
偶的解决办法:用hibernate来清空数据,
疑惑:为什么用JDBC就是不行呢???
问题二:
hibernatefactory类,用myeclipse插件生成的这个类,是蛮方便的,hibernatefactory.getsession()就能获取session了,方便啊,但它似乎经不起时间的考验,系统跑了1,2天后,就再也不能正常连接到数据库里了
偶的解决办法:才才实实起自己new config,再从自己new 的config里getsession
疑惑:为什么hibernatefactory会靠不住呢?
1 楼 Anatorian 2007-12-01  
hibernate有二次缓存的,就是所有session共享的缓存。你读出的数据可能是缓存里的。如果所有数据库访问都是通一个同一个sessionFactory的话,这个问题就会避免了。可是你直接用jdbc就等于绕过了hibernate的session,所以缓存里读出了脏信息。
2 楼 reno_k 2007-12-03  
补充一下,本人也考虑过这方面的问题:flush(),clear()了试过,一概无效,真不知道是不是应该高兴,也试过用HQL查询,也试过get(class,pk)
3 楼 blackteal 2007-12-03  
这是一个很基本的问题。你的flush(),clear()都只清空了一级缓存,二级缓存并没有被清空。
两种解决方案:1. 在查询你这个表时,避免把对象放入二级缓存(query.setCacheMode(CacheMode.IGNORE)).事实上你这么多的数据也是不应该放入二级缓存的。
2.清空二级缓存中此表对应的Pojo类。sessionFactory.evict(你的class类名)。
如何清空二级缓存所有的内容?楼下高手补充。也许清空所有二级缓存不是hibernate推荐的方式。
4 楼 ddandyy 2007-12-03  
1肯定是缓存问题
至于2 我几乎从不用自动生成的东西  建议查一些连接或者资源占用的 看看是否有什么东西没有放开
5 楼 andrewdu 2007-12-03  
为什么2天就当掉?我好像没遇到过
6 楼 reno_k 2007-12-04  
感谢blackteal
关于问题二,查了一下英文的网站,发现还真多,英文并不是太好,所以只看了关键的部分,就是说,避免用单态模式创建session
7 楼 rohuddu 2007-12-04  
用jdbc删除的话,hibernate的缓存不能同步了,
8 楼 smh2008 2007-12-04  
rohuddu 写道
用jdbc删除的话,hibernate的缓存不能同步了,

别出心裁
9 楼 wangxuliangboy 2007-12-20  
肯定是Hibernate 二级缓存的问题.

你用jdbc来删除数据的时候..相对hibernate的二级缓存是透明..

所以你必须得重新清空一下hibernate的二级缓存.

然后在重新查询.
这样就查不出数据来啦..
session.clear()清空缓存中所有持久化对象
对于二级缓存来说,在 SessionFactory 中定义了许多方法, 清除缓存中实例、整个类、集合实例或者整个集合。  sessionFactory.evict(Class clz);

10 楼 silence1214 2008-05-27  
这个问题也搞过我很郁闷,如果你没有用缓存的话,而出现这个问题,其实就是你数据源的问题,hibernate自带的数据源有bug,你换个就好了
11 楼 wang19841229 2008-05-30  
个人感觉还是缓存的问题,因为JDBC操作会绕过hibernate造成hibernate并不知道数据已经清空。所以才出现这个问题,但是我怀疑楼主是否开了二级缓存,如果打开了二级缓存这种问题是可能的,但是如果没有使用二级缓存,以上的推动就有问题了。因为二级缓存hibernate默认是不打开的
12 楼 fire314159 2008-05-30  
reno_k 写道
感谢blackteal
关于问题二,查了一下英文的网站,发现还真多,英文并不是太好,所以只看了关键的部分,就是说,避免用单态模式创建session



my sessionFactory generated by myeclipse is working fine. I dont know why singleton is not good, could you please tell us more details? For your second questio