zhangzhenhuajack / spring-data-jpa-guide

spring-data-jpa-guide,Spring Data JPA实战,SpringDataJpa详解
http://www.jackzhang.cn/spring-data-jpa-guide/
363 stars 157 forks source link

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

Open luozongle opened 3 years ago

luozongle commented 3 years ago

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

zhangzhenhuajack commented 3 years ago

image image

zhangzhenhuajack commented 3 years ago

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 commented 3 years ago

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

luozongle commented 3 years ago

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

zhangzhenhuajack commented 3 years ago

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