Как проверить метод из репозитория, который помечен как @Modifying? - PullRequest
0 голосов
/ 17 октября 2018

Например, у меня есть

public interface CrudUserRepository extends JpaRepository<User, Integer> {

@Modifying
@Query(nativeQuery = true, value = "UPDATE users SET active=?2 WHERE id=?1")
void setActive(long id, boolean active);
}

В моем тесте я вызываю этот метод, а затем нахожу по идентификатору.

@Autowired
CrudUserRepository crudUser;
@Transactional
@Test
public void setActiveTest(){
    User user = getUser();
    crudUser.save(user);

    crudUser.setActive(user.getId(), true);
    Optional<User> optUser = crudUser.findById(user.getId());
    assert optUser.get().isActive(); //here my test falls

И когда я выполняю crudUser.findById(user.getId()), мой optUser содержит этого пользователяне активен, но на самом деле он активен (я проверил это, установив @Rollback (false) и вручную отметив в db).

Как я могу проверить этот случай?

1 Ответ

0 голосов
/ 17 октября 2018

Потому что crudUser.save будет кешировать сущность.А когда вы вызываете crudUser.findById, JPA просто получает сущность из кэша, а не из базы данных.crudUser.setActive не обновлять entity.active в кеше.Изменить код, как показано ниже, можно исправить (очистить кэш JPA):

....
@PersistenceContext
EntityManager entityManager;
...
@Test
public void setActiveTest(){
  ...

  // clear the cache and force crudUser.findById from database
  entityManager.clear();

  Optional<User> optUser = crudUser.findById(user.getId());
  ...
}
...