我正在使用(Spring Data)JpaRepository来执行CURD操作。这里我看到了两个方法save和saveAndFlush。在这两种方法中我得到了相同的结果,它成功地将数据保存在数据库中。那么区别是什么呢?我没有使用任何类型的事务机制,而是使用 save 方法发出提交命令。
@Transactional
public BaseDto add(BulkPermitCategoryDto requestDto) {
BaseDto baseDto = new BaseDto();
try {
BulkPermitCategory category = ObjectConverter
.bulkPermitCategoryDtoToBulkPermitCategory(requestDto);
bulkPermitCategoryRepository.saveAndFlush(category);
baseDto.setStatusCode(0);
} catch (Exception e) {
log.error("exception occered ", e);
e.printStackTrace();
}
return baseDto;
}
和
@Transactional
public BaseDto add(BulkPermitCategoryDto requestDto) {
BaseDto baseDto = new BaseDto();
try {
BulkPermitCategory category = ObjectConverter
.bulkPermitCategoryDtoToBulkPermitCategory(requestDto);
bulkPermitCategoryRepository.save(category);
baseDto.setStatusCode(0);
} catch (Exception e) {
log.error("exception occered ", e);
e.printStackTrace();
}
return baseDto;
}
保存()
save()
正在调用EntityManager.persist()
或EntityManager.merge()
,这不会立即执行SQL语句。它们将在事务提交时执行。
saveAndFlush()
saveAndFlush()
另外调用 EntityManager.flush()
将执行所有保留的 SQL 语句。
因此,如果存在任何约束违规,您将在调用
saveAndFlush()
时得到异常,但在调用 save()
时不会得到异常
save()函数和saveAndFlush()函数执行相同的操作。区别在于 save() 不会立即将数据刷新或保存到数据库。它将把数据保留在内存中,直到调用提交或刷新为止。但是,如果使用 saveAndFlush() ,顾名思义,它会刷新数据,以便在您查询数据库时它会立即反映。这类似于 READ_COMMITTED。如果你明白了这一点,那就清楚了。