Spring Data JPA 中的 save() 和 saveAndFlush() 都可以返回实体 ID。
据我搜索,save()方法在被flush()和commit()调用之前应该无法返回任何值。但我可以使用 save() 方法获取实体 ID,就像 saveAndFlush() 一样。
当我实现 JpaRepository 并调用 save() 和 saveAndFlush() 方法时,我已经获得了它们的实体 ID。
所以我的问题是这怎么可能?是因为 save() 方法的 @Transacitonal 吗?如果是的话,这两种方法在这一点上真的有什么区别吗?
Spring Data JPA 中 save() 方法的行为由底层 JPA 提供程序决定。对于 Hibernate(Spring Data JPA 使用的默认 JPA 提供程序)来说,save() 方法不会立即将更改刷新到数据库。相反,当提交事务或显式调用刷新操作时,更改会排队并刷新到数据库。
但是,当使用支持在事务提交之前返回已保存实体的 ID 的数据库提供程序时,例如具有 AUTO_INCREMENT 功能的 MySQL,save() 方法可以立即返回 ID。