这个问题是在项目开发到一半的时候,莫名出现的bug,我还纳闷,明明仅仅执行了查询操作,怎么会有update操作的记录去修改了我数据库的对应值。以为自己方法写串线了,debug了好久都没找到原因。
起因是这样,因为业务要求,取出对象值后仅给前端返回自定义业务的set操作,并不需要去数据库修改对应行数据。但是前段每次执行查询操作后,调用object.set方法都自动执行了一次update操作,苦恼了一下午,在网上搜索了很多资料看完后,终于找到了答案。
没错 就是Springboot Jpa 的自动事务托管中,他自作聪明(也可能是自动事务更符合业务开发场景,我孤陋寡闻,自作聪明的说框架自作聪明了,哈哈),当session中的缓存对象数据行有改变时(set赋值后)与数据库数据不一致,这时候同步锁就会去flush数据库的对应行数据,让其和session中对象的数据相同。唉 这个多出来的update操作完全是我不需要的。
怎么办和业务冲突了。
在网上查阅后,最后总结出了三种解决方案
第一种就是直接关闭session的缓存,不建议这么干,因为很多业务还是需要用到session的。一旦这么干,你的很多业务就要另辟他法了。拆东墙补西墙!
第二种(标准开发中要这么设计)就是 创建两个相同的对象bean,一个PO 另一个VO,因为你对springboot jpa 自动事务托管的对象(PO)我们只执行get操作,不去set它,而是创建另一个同名的VO去接收数据