Spring Data Jpa Save 和 SaveAndFlush

问题描述 投票:0回答:2

我正在使用(Spring Data)JpaRepository来执行CURD操作。这里我看到了两个方法savesaveAndFlush。在这两种方法中我得到了相同的结果,它成功地将数据保存在数据库中。那么区别是什么呢?我没有使用任何类型的事务机制,而是使用 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;
}
spring spring-data spring-data-jpa
2个回答
4
投票

保存()

save()
正在调用
EntityManager.persist()
EntityManager.merge()
,这不会立即执行SQL语句。它们将在事务提交时执行。

saveAndFlush()

saveAndFlush()
另外调用
EntityManager.flush()
将执行所有保留的 SQL 语句。

因此,如果存在任何约束违规,您将在调用

saveAndFlush()
时得到异常,但在调用
save()

时不会得到异常

0
投票

save()函数和saveAndFlush()函数执行相同的操作。区别在于 save() 不会立即将数据刷新或保存到数据库。它将把数据保留在内存中,直到调用提交或刷新为止。但是,如果使用 saveAndFlush() ,顾名思义,它会刷新数据,以便在您查询数据库时它会立即反映。这类似于 READ_COMMITTED。如果你明白了这一点,那就清楚了。

© www.soinside.com 2019 - 2024. All rights reserved.