社区
Java SE
帖子详情
hibernate数据不同步
hailun
2008-12-02 09:38:26
选择一条数据进行更新操作,数据库可以更新成功,但页面上显示的有时候与数据库一致,有时候不一致,不知道什么原因
查资料是缓存原因,但不知道要怎么改呢,我每个增删改查都有在自己的事务内处理,每次操作完都会关SESSION的
...全文
79
10
打赏
收藏
hibernate数据不同步
选择一条数据进行更新操作,数据库可以更新成功,但页面上显示的有时候与数据库一致,有时候不一致,不知道什么原因 查资料是缓存原因,但不知道要怎么改呢,我每个增删改查都有在自己的事务内处理,每次操作完都会关SESSION的
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hailun
2008-12-03
打赏
举报
回复
谢谢楼上
似乎是明白了
Landor2004
2008-12-03
打赏
举报
回复
[Quote=引用 7 楼 hailun 的回复:]
引用 6 楼 Landor2004 的回复:
引用 4 楼 hailun 的回复:
哦,如果不显示的调用flush()方法,close()方法的时候不是会先调用flush()方法的吗?然后再去 close()的吗
flush会在事务提交的时候被自动调用,其他的时候就没那么智能了
对呀,那既然是提交的时候会自动调用,那么我们就不用显示的调用了啊,但如果是这样,那还要这个flush方法有什么用呢
[/Quote]
有两种情况,在hibernate中配置autocommit
autocommit=true 说明允许自动提交,但是在调用save等方法后,也不会同步到数据库,必须再调用flush方法
autocommit=false 说明必须显示的提交事务,这时即使调用了flush方法,也不会同步到数据库,必须commit
hailun
2008-12-03
打赏
举报
回复
[Quote=引用 6 楼 Landor2004 的回复:]
引用 4 楼 hailun 的回复:
哦,如果不显示的调用flush()方法,close()方法的时候不是会先调用flush()方法的吗?然后再去 close()的吗
flush会在事务提交的时候被自动调用,其他的时候就没那么智能了
[/Quote]
对呀,那既然是提交的时候会自动调用,那么我们就不用显示的调用了啊,但如果是这样,那还要这个flush方法有什么用呢
duhongltz
2008-12-03
打赏
举报
回复
[Quote=引用 2 楼 hailun 的回复:]
不知道为什么,我在增删改查的每个自己的事务里最后都有关闭session
有问题的情况是,用load方法,没有关闭session
改掉后,用get 方法 ,关闭session测试了几次好像问题解决了
不知道是什么原因
[/Quote]
load 得到的是代理对象 get得到的是实体对象
Landor2004
2008-12-02
打赏
举报
回复
[Quote=引用 4 楼 hailun 的回复:]
哦,如果不显示的调用flush()方法,close()方法的时候不是会先调用flush()方法的吗?然后再去 close()的吗
[/Quote]
flush会在事务提交的时候被自动调用,其他的时候就没那么智能了
shenjie1989
2008-12-02
打赏
举报
回复
当你出去的时候,是先关卧室门还是先关大门呢????????呵呵
hailun
2008-12-02
打赏
举报
回复
哦,如果不显示的调用flush()方法,close()方法的时候不是会先调用flush()方法的吗?然后再去 close()的吗
然月枕流君
2008-12-02
打赏
举报
回复
具体问题可能是懒加载的问题引起的,
修复方法,
可以更改成立即加载;
或者
session.flush();
session.close();
关闭前flush(),他是刷新缓存,并且能够强制缓存与数据库同步更新;
hailun
2008-12-02
打赏
举报
回复
不知道为什么,我在增删改查的每个自己的事务里最后都有关闭session
有问题的情况是,用load方法,没有关闭session
改掉后,用get 方法 ,关闭session测试了几次好像问题解决了
不知道是什么原因
Landor2004
2008-12-02
打赏
举报
回复
session在关闭之前的get或者load操作会产生不一致情况,因为会读取一级缓存
而如果是list,那不会出现不一致(除非你设置了二级缓存)
看你的代码是怎么写的了。强制刷出数据,可以用session.refesh(),但是不推荐这样
hibernate
做
数据
同步
时的问题
当我们有做
数据
同步
需求时,如果表中除了主键不能重复,还有其他字段比如名称不能重复,那么在做
同步
时可能会出现以下情况: A平台上
数据
已经删除,此时B平台的
数据
库还未
同步
,这时A平台新增了一个名称与原来一样的资源。这时B平台开始做
数据
同步
,不巧的是,删除操作在添加操作之后,那么会出现无法保存名字相同的
数据
。那么该怎么办? 解决方法就是先做删除,后做保存。但由于是批量操作,即使用一个commit,还
hibernate
手动更新
数据
查询
数据
与更新
数据
不
同步
最近在项目中,二级密码验证一直出问题,本来利用的是Ajax异步提交验证,程序刚才开始运行时候没什么问题,但是一旦用户修改一下二级密码之后,当再需要输入二级密码的时候就会一直验证不成功,得到的密码一直都是更新之前的
数据
,查了很久资料,才发现原来是由于缓存的问题,由于JQuery 与ajax本身存在一定缓存,
hibernate
也存在一级 与二级缓存,所以导致手动更新后的
数据
一直不能与查询
数据
同步
。
解决方法:
第一步 使jquery Ajax不缓存
Hibernate
jdbc混合使用导致保存
数据
不准确
由于shiro 的漏洞问题升级导致
同步
升级
hibernate
,在升级到5.2后发现之前好使的方法在保存
数据
时出现遗漏
数据
的bug 方法中同时使用了jdbc和
hibernate
,jdbc执行的是批量保存
数据
,update时总有几个
数据
是没有成功的,排查
数据
没有发现任何问题,最后在
hibernate
执行输出的sql中发现,会有交叉提交的情况,经过测试把
hibernate
使用session保存
数据
的方法改成了jdbc方式,大功告成。 根据个人理解混合使用并不存在这种bug,希望懂原理的大神解惑,您的意见对我至关重
Hibernate
数据
的三种状态
hibernate
数据
的三种状态 ①、临时状态 使用 new语句创建出来的对象 属于 "临时状态",
数据
只存在与内存中的,目前
数据
还未存放到
数据
库中 ②、持久化状态 临时状态的
数据
,使用 save() 或者 saveOrUpdate() 方法,可以将
数据
从 "临时状态" 转变成 "持久化状态" ③、游离状态持久化状态的
数据
,可以使用 evict() 或者 close()...
Hibernate
数据
修改后不能及时更新
主要表现在新增、修改
数据
后,在
数据
列表中不能显示刚插入
数据
的关联对象的信息(新增插入或修改的
数据
主
数据
能显示,只有关联的
数据
不能显示),但刷新后能显示,再刷新可能又显示不出来了。随机的能显示或不能显示。搞不懂。 当你手动修改了
数据
库,
Hibernate
缓存中的
数据
就有可能是过期的。为了保证
Hibernate
与
数据
库一致,一般的做法是在手动修改
数据
库之后,使用
Hibernate
查询
数据
之前,清
Java SE
62,615
社区成员
307,307
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章