Dados de inicialização do Spring JPA - Modificando consulta de atualização - Atualizar contexto de persistência

Estou trabalhando com o Spring Boot 1.3.0.M4 e um banco de dados MySQL.

Tenho um problema ao usar consultas modificadas, o EntityManager contém entidades desatualizadas após a execução da consulta.

Repositório JPA original:
public interface EmailRepository extends JpaRepository<Email, Long> {

    @Transactional
    @Modifying
    @Query("update Email e set e.active = false where e.active = true and e.expire <= NOW()")
    Integer deactivateByExpired();

}

Suponha que tenhamosE-mail [id = 1, a, ctive = true, expira = 2015/01/01] no DB.

Após a execução:

emailRepository.save(email);
emailRepository.deactivateByExpired();
System.out.println(emailRepository.findOne(1L).isActive()); // prints true!! it should print false
Primeira abordagem para resolver o problema: adicioneclearAutomatically = true
public interface EmailRepository extends JpaRepository<Email, Long> {

    @Transactional
    @Modifying(clearAutomatically = true)
    @Query("update Email e set e.active = false where e.active = true and e.expire <= NOW()")
    Integer deactivateByExpired();

}

Essa abordagem limpa o contexto de persistência para não ter valores desatualizados, mas descarta todas as alterações não liberadas ainda pendentes no EntityManager. Como eu uso apenassave() métodos e nãosaveAndFlush() algumas alterações são perdidas para outras entidades :(

Segunda abordagem para resolver o problema: implementação customizada para repositório
public interface EmailRepository extends JpaRepository<Email, Long>, EmailRepositoryCustom {

}

public interface EmailRepositoryCustom {

    Integer deactivateByExpired();

}

public class EmailRepositoryImpl implements EmailRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    @Override
    public Integer deactivateByExpired() {
        String hsql = "update Email e set e.active = false where e.active = true and e.expire <= NOW()";
        Query query = entityManager.createQuery(hsql);
        entityManager.flush();
        Integer result = query.executeUpdate();
        entityManager.clear();
        return result;
    }

}

Essa abordagem funciona de maneira semelhante a@Modifying(clearAutomatically = true) mas primeiro força o EntityManager a liberar todas as alterações no banco de dados antes de executar a atualização e depois limpa o contexto de persistência. Dessa forma, não haverá entidades desatualizadas e todas as alterações serão salvas no DB.

Gostaria de saber se há uma maneira melhor de executar instruções de atualização no JPA sem ter o problema das entidades desatualizadas e sem a liberação manual no DB. Talvez desativando o cache de segundo nível? Como posso fazer isso no Spring Boot?

Atualização 2018

O Spring Data JPA aprovou meu PR, existe umflushAutomatically opção em@Modifying() agora.

@Modifying(flushAutomatically = true, clearAutomatically = true)

questionAnswers(2)

yourAnswerToTheQuestion