Spring Boot JPA - @Modifying (clearAutomatics = true) не обновляет значения кэша - PullRequest
0 голосов
/ 13 апреля 2020

Я использую данные JPA Spring Boot для обновления столбца в моей таблице. Моя база данных Postgres. Я пытаюсь обновить значение столбца statusCode в моей БД. Я обновляю его до 6 из 1. Ниже приведен код для того же:

Репозиторий

public interface MailRecordRepository extends JpaRepository<MailRecords, Integer> {

    // Fetch the rows which are new in status
    List<MailRecords> findTop100ByEmailStatusCode(int statusCode);

    // Update status to in-progress
    @Modifying(flushAutomatically = true, clearAutomatically = true) //, flushAutomatically = true
    @Query(value = "UPDATE users.usertbl SET statusCode = :inProgressStatusCode where " +
            "statusCode = 1 RETURNING *;", nativeQuery = true)
    public List<MailRecords> updateRecordsToInProgress(
            @Param("inProgressStatusCode") int inProgressStatusCode);
}

Я пытаюсь получить обновленные строки с помощью RETURNING ключевое слово в моем родном запросе, который поддерживается Postgres. Я присваиваю обновленные строки, возвращенные запросом, списку и печатаю его в консоли. Но обновленный список возвращает старое значение для столбца statusCode, т. Е. 1 вместо обновленного значения, т. Е. 6 Ниже приведен код для того же самого:

ServiceClass

public class MailServiceImpl implements MailService {

    @Autowired
    private MailRecordRepository mailRecordRepository;
    @Autowired
    private MailHandler mailHandler;
    @Autowired
    private EntityManager entityManager;

    @Override
    public List<MailRecords> getMailRecords() {
        return (List<MailRecords>) mailRecordRepository.findAll();
    }

    @Override
    public List<MailRecords> processEmailRecords() {
        //fetch records from DB which are in new status
        List<MailRecords> mailRecordsToBeSent = mailRecordRepository.findTop100ByEmailStatusCode(1);

        // update the status to in-progress
        //entityManager.clear();
        List<MailRecords> updatedMailRecords = mailRecordRepository.updateRecordsToInProgress(6);

        return updatedMailRecords;
    }

Если я использую метод очистки менеджера сущностей, обновленные значения будут отражены. Но я пытаюсь понять, почему свойство @Modifying(flushAutomatically = true, clearAutomatically = true) не очищает значения кэша? Почему я должен вызывать entityManager.clear() явно? Кто-нибудь может исправить мое понимание и указать, где я иду не так?

1 Ответ

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

Я немного удивлен, что возвращающиеся сущности работают вообще.

Но у меня есть теория, что может происходить, которую вы можете проверить с помощью отладчика:

  1. Оператор выполняется, обновляя строки в базе данных
  2. Оператор возвращает ResultSet с обновленными значениями
  3. Реализация JPA (Hibernate?) Игнорирует все, кроме идентификаторов и использует их для поиска сущностей в кеше первого уровня и возвращает их.
  4. Spring Data JPA выполняет flu sh и очищает кеш первого уровня. Затем возвращает все, что получил от реализации JPA на шаге 3.

Вы уже нашли обходной путь для этого.

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