我正在为 Spring Data JPA 存储库编写一个基于事务性 junit 的 IT 测试。要检查表中的行数,我使用侧 JDBCTemplate。
我注意到,在事务上下文中调用 oforg.springframework.data.repository.CrudRepository#save(S)
不会生效。未执行 SQL 插入,表中的行数未增加。
但是,如果我在执行 SQL 插入并增加行数org.springframework.data.repository.CrudRepository#count
之后调用。save(S)
我猜这是 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>