spring - 春季无法从数据库单元测试中删除行
问题描述
我正在我的服务类中测试一个删除方法,它不会从数据库中删除行。当我在应用程序运行时使用相同的方法时,它工作正常。我正在使用 MySQL 和 H2database 插件来测试应用程序。其他 CRUD 测试方法工作得很好。
测试班
@RunWith(SpringRunner.class)
@SpringBootTest
public class StudentAccountApplicationTests {
@Autowired
StudentAccountService studentAccountService;
@Test
public void testStudentAccountDeletion(){
Student student1 = new Student ("john","smith","studying");
Student student2 = new Student ("will","ferrel","finished");
Student student3 = new Student ("louis","johnsson","finished");
StudentAccount studentAccount1 = new StudentAccount ("josm","josm","studying", student1 );
StudentAccount studentAccount2 = new StudentAccount ("wife","wife","studying", student2);
StudentAccount studentAccount3 = new StudentAccount ("lojo","lojo","studying", student3);
studentService.save(student1);
studentService.save(student2);
studentService.save(student3);
studentAccountService.save(studentAccount1);
studentAccountService.save(studentAccount2);
studentAccountService.save(studentAccount3);
List<StudentAccount> studentAccountsToDelete = studentAccountService.getStudentAccountsFromFinishedStudents();
studentAccountService.deleteStudentAccountsFromFinishedStudents(studentAccountsToDelete);
List<StudentAccount> studentAccountsAfterDeletion = studentAccountService.getAllStudentAccounts();
assertEquals(1, studentAccountsAfterDeletion.size());
}
}
StudentAccountServiceImpl
public class StudentAccountServiceImpl implements StudentAccountService {
@Autowired
StudentAccountRepository studentAccountRepository;
@Override
public void deleteStudentAccount(StudentAccount studentToDelete) {
studentAccountRepository.delete(studentToDelete);
}
@Override
public void deleteStudentAccountsFromFinishedStudents(List<StudentAccount> studentAccountsToDelete) {
studentAccountsToDelete.forEach(studentAccount -> {
deleteStudentAccount(studentAccount);
});
}
}
测试失败,因为学生帐户没有被删除,所以列表大小是 3 而不是 1。如前所述,该方法studentAccountsToDelete
在应用程序运行时正常工作。如果所有其他 CRUD 方法都有效,我不知道这里有什么区别。我的猜测是 H2 数据库存在问题。需要一些帮助。提前致谢
解决方案
找到了解决方案。答案在发生映射的实体中。在实体中使用一对多映射时,这似乎是一个常见错误
我改变了这个:
@OneToMany(mappedBy = "student", cascade=CascadeType.ALL)
private Collection<StudentAccount> studentAccounts;
对此:
@OneToMany(mappedBy = "student", orphanRemoval=true)
private Collection<StudentAccount> studentAccounts;
请注意,我为此替换cascade=CascadeType.ALL
的orphanRemoval=true
是告诉 hibernate 删除对不再存在的对象的引用。这对于清理依赖对象非常有用。就我而言,完成职业生涯的学生不再需要学生帐户。我希望这个答案对某人有所帮助。干杯
推荐阅读
- angular - Angular 8 - 构建通用 SSR 时出现致命错误 - 堆限制附近的无效标记压缩分配失败
- android - 为什么 Looper.loop() 不会阻塞 UI 线程
- java - Order by 子句不适用于 Play Ebean 中的字符串
- reactjs - i18next-scanner 删除多个值
- .net - 提供程序:命名管道提供程序,错误:40 - 无法打开与 SQL Server 2012 的连接
- python - 如何在 Django 中创建一个支持用户可安装的第三方插件集成的架构
- c# - 如何将 Singleton DI 用于 Microsoft DistributedRedisCache?
- oracle - 如何在 oracle XML 中省略 XMLForest 函数中使用的别名
- api - Jmeter 在主机中发现非法字符:'/' ISSUE
- java - Spring 5 - @Bean 方法的自定义限定符 - NoSuchBeanDefinitionException