问题描述
默认情况下,Spring Data JPA已禁用自动提交。
因此,如果我正在使用/扩展CrudRepository
来使用save
方法保存对象,那么幕后发生了什么?将对象保存到DB后,spring jpa是否也会提交操作。
如果没有,我如何显式提交操作?
编辑以下“ Michal Drozd”评论:(以下内容适用于JpaRepository而非CrudRepository)
本文:Difference Between save() and saveAndFlush() in Spring Data JPA似乎表明对于Spring Data JPA,默认情况下自动提交为false。
当我们使用save()方法时,与保存相关的数据 除非并且直到显式操作,否则操作不会刷新到数据库 调用了flush()或commit()方法。
解决方法
save()
的 CrudRepository
方法本身就是@Transactional
。因此,如果您不在另一个事务的上下文中调用它,它将创建一个并根据持久实体的成功或失败来提交或回滚它。
如果启用了Spring JPA自动提交(@
),则在数据库设置过程中(春季初始化期间),数据库中的autocommit变量设置为true(对于MySQL,它是spring.datasource.hikari.auto-commit=true
),它将不会为每个SQL语句调用commit。
如果要使用提交,则需要事务。因此,要么启用自动提交,要么在事务中工作。