Я столкнулся с этим странным поведением при выполнении модульных тестов TestNG с Spring JPA для следующих объектов.
@Entity
public class ChildEntity {
public ChildEntity(UUID id, ParentEntity parent){
this.id = id;
this.parentEntity = parent;
}
@Id
@Column(name = "id")
private UUID id;
@ManyToOne
private ParentEntity parentEntity;
}
@Entity
public class ParentEntity {
public ParentEntity(UUID id){
this.id = id;
}
@Id
private UUID id;
@OneToMany(
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true,
mappedBy = "parentEntity")
private Set<ChildEntity> childEntities;
}
Модульный тест выглядит следующим образом.
@SpringBootTest
public class ChildEntityRepoTest extends AbstractTestNGSpringContextTests {
@Autowired
private ChildEntityRepository childEntityRepository;
@Autowired
private ParentEntityRepository parentEntityRepository;
@Test
public void testDelete() {
UUID parentId = UUID.randomUUID();
ParentEntity parentEntity = new ParentEntity(parentId);
parentEntityRepository.save(parentEntity);
UUID childId = UUID.randomUUID();
ChildEntity childEntity = new ChildEntity(childId, parentEntity);
childEntityRepository.save(childEntity);
childEntityRepository.deleteById(childEntity.getId());
Optional<ChildEntity> childEntityOpt = childEntityRepository.findById(childEntity.getId());
assertFalse(childEntityOpt.isPresent());
}
}
С этим устройствомтест, модульный тест не пройден.И как только я проверил некоторые журналы и отладки, предполагаемый удаленный объект все еще там.
Теперь я изменил
AbstractTestNGSpringContextTests
AbstractTransactionalTestNGSpringContextTests
, и тестовый пример проходит, что означает, что дочерняя сущность фактически удаляется.
Если для дочерней сущности не установлены родительские сущности, удаление работает в любом случае.Может ли кто-нибудь объяснить или указать на статью, которую я могу использовать, чтобы понять это поведение?