在使用hibernate时,假如存在一个方法它去更新一个实体TdProduct,如果是非立即刷新模式,此时hibernate是不会向数据库发起SQL的,
并且如果在此方法之后,又调用了第二个查询该实体的方法,并且set了某个值,但并没有执行update操作(注意:仅仅是查询操作)。此时问题就出来了,hibernate会在最后的时候进行flush操作,此时它会将第二个方法中的set的值更新过去。因为其实第一步hibernate是它实体放在一级缓存中没有立即向数据提交SQL,第二个方法查出来的实际是从一级缓存中读到的,而如果改变了某个值,因此实际上最后便在flush操作时反映出来了。
那是不是在第一个更新方法里显示调用flush方法就可以解决此问题了呢,答案是否定的。因为hibernate在最后的时候会去找一级缓存中的实体是否发生了变化。如果发生变化还是会做一次更新操作。也就是说这种情况下会做向数据库发起两次更新语句。如果没有变化就不会发生第二次更新语句。因此在做这种带有对同一实体同时具有更新和查询操作的时候一定要小心这一点!
3451

被折叠的 条评论
为什么被折叠?



