Я пишу транзакционный ИТ-тест на основе Junit для репозитория Spring Data JPA.Для проверки количества строк в таблице я использую сторону JDBCTemplate.
Я замечаю, что в транзакционном контексте вызов org.springframework.data.repository.CrudRepository#save(S)
не вступает в силу.SQL-вставка не выполнена, количество строк в таблице не увеличено.
Но если я вызову org.springframework.data.repository.CrudRepository#count
после save(S)
, то SQL-вставка будет выполнена и число строк увеличено.
Полагаю, это поведение кеша JPA, но как это работает в деталях?
Код с Spring Boot:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ErrorMessageEntityRepositoryTest {
@Autowired
private ErrorMessageEntityRepository errorMessageEntityRepository;
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
@Transactional
public void save() {
ErrorMessageEntity errorMessageEntity = aDefaultErrorMessageEntity().withUuid(null).build();
assertTrue(TestTransaction.isActive());
int sizeBefore= JdbcTestUtils.countRowsInTable(jdbcTemplate, "error_message");
ErrorMessageEntity saved = errorMessageEntityRepository.save(errorMessageEntity);
errorMessageEntityRepository.count(); // [!!!!] if comment this line test will fail
int sizeAfter= JdbcTestUtils.countRowsInTable(jdbcTemplate, "error_message");
Assert.assertEquals(sizeBefore+1, sizeAfter);
}
Сущность:
@Entity(name = "error_message")
public class ErrorMessageEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID uuid;
@NotNull
private String details;
Репозиторий:
public interface ErrorMessageEntityRepository extends CrudRepository<ErrorMessageEntity, UUID>