insert 或 update 都是通过调用 JpaRepository 的 save 方法实现的。
本文以 User,Role,Group (用户,角色,组)为例进行阐述。
用户和角色是多对多关系,用户和组是多对一关系。
单个实体类的 save
对于实体类 User ,调用 save(user) 方法,分为以下情况讨论:
-
假如 user 的主键字段(@Id 修饰的字段)为空,是新增方法,执行一条 insert 语句。
-
假如主键字段不为空则会先执行 select 语句,查看当前主键对应的 user 是否存在。
- 假如不存在则执行 insert 语句,需要注意的是如果主键有自动生成规则,保存的主键则会根据数据库的规则生成而不是设置的值。
- 假如存在则比较字段值有无变化,有变化则执行 update 语句。
总结如下:
- 执行 insert 语句的条件:待保存的实体类主键为空,或者主键是一个在数据库中不存在的值。
- 执行 update 语句的条件:待保存的实体类主键不为空,并且主键是一个在数据库中存在的值,并且相比数据库存在的值有变化。
ManyToOne 关系中的 save
对于实体类 User 和 Group,User 与 Gr