gpt4 book ai didi

java - @DataJpaTest 使用存储库保存实体,无法使用 JdbcTemplate 检索数据

转载 作者:行者123 更新时间:2023-12-01 17:16:58 26 4
gpt4 key购买 nike

我正在从 spring-boot 1.5.x 迁移到 2.0.4,并注意到 @DataJpaTest 的一个有趣的案例/行为

我有一个测试

@ExtendWith(SpringExtension.class)
@DataJpaTest
public class SomeTest {

@Autowired
private SomeRepository repository;
@Autowired
private JdbcTemplate template;


@Test
public void save() {

String number = "123";

SomeEntity entity = SomeEntity.builder()
.number(number)
//some attributes here
.build();

repository.save(entity);


//that line fails because SELECT returns nothing back
Map<String, Object> result = template.queryForMap("select id, version from some_entity where number=?", number);

}

上面的测试失败,因为模板没有返回任何内容。我什至在日志中看不到触发的 INSERT 语句。但是使用旧版本的 spring-boot 1.5.x,我可以看到 INSERT 已被触发并且测试通过。

但升级版本的有趣之处在于,如果我添加一行 repository.findAll (而不是 repository.findById(id) -> 那行不会有帮助)在 repository.save(entity) 之前,一切都运行良好,并且在日志中,我可以看到并触发了 INSERT 语句。

有人可以帮助我了解发生了什么以及它在幕后是如何工作的吗?为什么实体没有被持久化?以及为什么 repository.findAll 如此特殊,使得它能够持久保存数据。

谢谢。

最佳答案

发生这种情况是因为 findAll 方法触发了从内存(持久性上下文)到数据库的所有更改的刷新。

您可以在我的屏幕上看到这一切发生的地方: enter image description here

JpaRepository中也有对应的方法:

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html#flush--
它可用于立即刷新更改。

此外,您可以使用 saveAndFlush 方法:

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html#saveAndFlush-S-

关于java - @DataJpaTest 使用存储库保存实体,无法使用 JdbcTemplate 检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61366276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com