hibernate自动更新持久化类的问题?

有碰到过改变了一个持久化类的值但是没有主动更新到数据库结果hibernate自动把值更新到数据库了。看了网上的一些帖子和解答感觉语焉不详,说什么持久化类只要做了改变hibernate就会自动更新到数据库,照这个说法我们都不用手动去做update操作了?另外没有显式的update操作我怎么知道hibernate什么时候去更新呢?求高人解答,最好能有hibernate的官方说明或文档。

0

2个回答

是的,
隐式的修改:注解的实体和对象,修改了自动同步数据库(添加了对事物的支持)
显式的修改:就是比较传统的hql、sql这样的更新语句

建议使用显式的修改,比较明确

0
malie1981
malie1981 回复伈照不宣: 我看到hibernate持久化类不需要显式update只要调用flush就会自动提交,而自动flush的情况是1,调用某些查询的时候2,transaction commit的时候3,手动调用flush的时候,因为我在set某些值后又调用了实体中的get方法获得某些属性进行判断,在这个判断的过程中抛出异常,会不会是在调用get方法的时候会触发flush导致更新到数据库?
大约 3 年之前 回复
zy_281870667
Bug开发攻城狮 回复malie1981: 我们控制事务一般是使用spring的aop的,它是针对我们代码对session的操作而执行事务的,hibernate的隐式修改,是根据代理对象的字节码更新数据库的,不属于我们的代码操作,所以不属于aop管理,代码异常了,也就不能回滚了
大约 3 年之前 回复
malie1981
malie1981 回复伈照不宣: 这样好像有点麻烦。另外一个疑问是这个隐式修改难道不受事务控制吗?程序在设置了值之后后面的代码中抛出了runtimeexception错误,但是这个隐式更新还是执行了。如果是按照显式更新的事务理解发生runtimeexception整个事务应该是会回滚的
大约 3 年之前 回复
zy_281870667
Bug开发攻城狮 回复malie1981: 在service关闭事务,在执行特定的方法再开启事务,显式的修改
大约 3 年之前 回复
malie1981
malie1981 谢谢回复,请问有没有办法在hibernate的配置或者参数设置里不让他隐式修改,很多程序员并没有注意到这个问题,这样会很危险
大约 3 年之前 回复

hibernate对你的持久化bean做了动态代理,也就是你hibernate映射文件,对应的bean对根据cglib生成的新字节码文件,
在你做set操作改变其值的时候,它会试图去更新数据库数据

0
w172087242
little_how 如果有帮助,希望能结帖
大约 3 年之前 回复
w172087242
little_how 回复malie1981: 那是因为有些设置的是只读事务,那样就不会更新数据库,还有的手动清除了session缓存的结果集,清除方法evict
大约 3 年之前 回复
malie1981
malie1981 不好意思,忘了感谢你的回答了
大约 3 年之前 回复
malie1981
malie1981 但是这种自动更新的情况似乎并不是每次都发生。不然的话所有取出来的持久化类不是都要先分离掉才能做赋值操作了。但是一般项目代码并没有太过关注这个事情。我觉得hibernate这么做不是太好
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!