spring-data-jpa-guide icon indicating copy to clipboard operation
spring-data-jpa-guide copied to clipboard

想请教一下 jpa save方法 是怎么判断是不是真的update呢

Open luozongle opened this issue 4 years ago • 5 comments

发现如果调用save方法保存的实体类跟数据库里的数据一样 jpa并没有执行update语句 貌似是又去数据库里查了一次 但是查询出来怎么判断的呢

luozongle avatar Aug 22 '20 08:08 luozongle

image image

zhangzhenhuajack avatar Aug 23 '20 13:08 zhangzhenhuajack

image 一:如果实例里面没有如下标示的@version字段,那么如果ID为空,直接insert,如果ID有值,jpa会发起select查询看看这个id对应的记录是否存在,如果存在update,如果不存在insert;

@Version
private Long version;

二:如果实例有上的@Version字段 version和ID都要有值才会才发发起select查询对象是否数据库里面的有,如果有update,如果没有insert; 总结:

  1. 当ID和Version字段都有值的情况下才会认为可能是新对象;当save的时候,每次都会执行两条sql。
  2. 如果ID活着Version字段没有值,直接insert;

zhangzhenhuajack avatar Aug 23 '20 13:08 zhangzhenhuajack

不知道的情况下:spring.jpa.show-sql=true自己观察

zhangzhenhuajack avatar Aug 23 '20 13:08 zhangzhenhuajack

奥奥 但是我打开这个查看执行的sql spring.jpa.show-sql=true 发现正常来说是要执行update的 因为这个实体对象有id,当和这个实体类与数据库里的字段相同的时候 它就不执行update了 我又没重写equals 它是怎么判断需不需要真的执行update的呢

luozongle avatar Aug 23 '20 13:08 luozongle

see: https://github.com/zhangzhenhuajack/spring-data-jpa-guide/wiki/SpringDataJpa%E4%B9%8BHibernate5.0%E7%9A%84Entity%E5%88%A4%E6%96%ADDirty%E7%9A%84%E8%BF%87%E7%A8%8B

zhangzhenhuajack avatar Aug 23 '20 14:08 zhangzhenhuajack