@DataJpaTest сохранение объекта с помощью репозитория, не может получить данные с помощью JdbcTemplate - PullRequest
0 голосов
/ 22 апреля 2020

Я мигрирую с 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 настолько особенный, что позволяет сохранять данные.

Спасибо.

1 Ответ

0 голосов
/ 22 апреля 2020

Это происходит потому, что метод findAll запускает flu sh всех изменений из памяти (контекст постоянства) в базу данных.

Вы можете видеть на моем экране место, где все это происходит: enter image description here

В JpaRepository также существует соответствующий метод:

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html#flush -
Может использоваться для немедленного изменения гриппа sh.

Кроме того, вы можете использовать метод saveAndFlu sh:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...