Spring Data Jpa EntityManager refre sh не работает - PullRequest
3 голосов
/ 03 марта 2020

Я хочу применить внешние изменения в Entity. поэтому я использовал refre sh () в EntityManager, он работает в сеансе EntityManager. но он не работает во внешних изменениях.

он основан на SpringBoot 2.x. это мой простой код.

@ExtendWith(SpringExtension.class)
@SpringBootTest
class RewardOrderRepositoryTest {
    @Inject
    private TestRepository testRepository;

    @PersistenceContext
    private EntityManager entityManager;

    @Test
    @Transactional
    @Rollback(false)
    public void test() {
        final Test test = testRepository.findById(8L).get();
        assertThat(test.getName(), is("Tom"));
        // BREAK POINT : name modify to external mysql client(ex) mysql workbench)
        entityManager.refresh(test);
        assertThat(test.getName(), is("Alice")); // it's false, still Tom.
    }
}

Почему внешние изменения не отражаются? Метод refre sh () используется только в сеансе EntityManager?

1 Ответ

1 голос
/ 03 марта 2020

Это вызвано уровнем изоляции транзакции - MySQL по умолчанию REPEATABLE READ :

Это уровень изоляции по умолчанию для InnoDB. Последовательные чтения в одной и той же транзакции считывают моментальный снимок, созданный при первом чтении. Это означает, что если вы выполняете несколько простых (неблокирующих) операторов SELECT в одной транзакции, эти операторы SELECT также согласуются друг с другом.

Тест запустил транзакцию, поэтому он будет считывать те же данные, даже если они были изменены в другой транзакции.

Вы должны быть в состоянии получить требуемое поведение с помощью явная установка уровня изоляции:

@Transactional(isolation=Isolation.ISOLATION_READ_COMMITTED)

Не тестируется в методах тестирования: атрибут isolation, по-видимому, не поддерживается в методах тестирования в соответствии с javado c из TransactionalTestExecutionListener.

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