我有时在 JUnit 测试中使用 @Transactional 注释。我在 JUnit 中使用 @Transactional 来延迟获取集合。
目前我面临着 @Transactional 注释的未知行为。
在我的数据库中,我有一个 Car 实体。我正在测试中删除这个实体。如果我在测试中使用@Transactional,那么该实体不会从数据库中删除。 否则,如果我不使用@Transactional,则该实体将被删除。 我在数据库中每次测试后都会看到这一点。
我有标准实体和存储库。 我的实体:
@Entity
public class Car {
@Id
@GeneratedValue
private int id;
private String model;
//...constructors, getters and setters }
我的存储库:
public interface CarRepository extends JpaRepository<Car, Integer>{
List<Car> findByModel(String mazda);
}
我的测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class RelationsTest {
@Autowired
CarRepository carRepository;
@Test
//@Transactional
public void deleteCar() throws Exception {
List<Car> cars = carRepository.findByModel("Mazda");
assertThat(cars).hasSize(1);
carRepository.deleteById(cars.get(0).getId());
}
使用 @Transactional 实体未从数据库中删除的原因是什么?
来自 Spring Boot 文档:
如果你的测试是@Transactional,它默认会在每个测试方法结束时回滚事务。
好吧,但是我在 @Transactional 中删除实体的问题是在测试函数内部,删除也不会发生。对已删除的实体进行查找仍将返回未删除的实体:
e = new Entity(...
repository.save(e);
repository.delete(e);
x = repository.findById(e.getId());
现在 x 保留找到的(未删除的)实体!
因此我通过连接表进行的级联删除(不是此处伪代码的一部分)不会执行。
删除@Transactional,一切都按预期进行。我想让 @Transactional 在测试后重置所有测试实体。