我在我的一个App屏幕中使用Spring JpaRepository进行CRUD实现。作为其中的一部分,我正在开发一个功能,用户可以将所有Car实体或任何内容(应回滚)保存到数据库中。我不知道如何使用Spring Boot,Spring Rest,Spring Jpa实现此功能。
以下是我的源代码。
@Repository
interface CarRepository extends JpaRepository<Car, Integer> { }
@Service
class CarService {
@Autowired
CarRepository repo;
@Transactional(rollbackFor=RuntimeException.class)
public List<Car> saveAllOrNone(List<Car> cars) {
for(Car car: cars) {
repo.save(car);
}
}
}
我无法弄清楚我在做什么错。
当我使用两个不同的数据进行测试时,其中1个数据包含无效数据,另一个数据被插入数据库而不是回滚。
除此之外,我收到了
UOWManager transaction processing failed:nested exception is com.ibm.wsspi.uow.UOWException: javax.transaction.RollbackException
请帮帮我。谢谢。
答案 0 :(得分:1)
尽管已经很晚了,但我想发布答案,因为有人会觉得这很有用。我通过使用资源here
在我的Spring启动应用程序中实现JPA事务管理器来修复错误答案 1 :(得分:0)
似乎@Transactional不适合你。我可以理解,您的应用程序中有一些配置可能是不负责创建DataSourceTransactionManager
的。如此处所述,这应该是自动的:
Spring Boot将检测类路径上的spring-jdbc和h2和will 自动为您创建一个DataSource和一个JdbcTemplate。因为 这样的基础设施现在可用,你没有专门的 配置时,还将创建一个DataSourceTransactionManager 你:这是拦截@Transactional的组件 注释方法
所以我看到了两种解决问题的方法。
第一种是使用Spring Repository中可以接受您的汽车列表的save
方法:
repo.save(cars);
这将起作用,因为Spring有一个内部@Transactional用于存储库方法。
另一种选择是与@SpringBootApplication
注释@EnableTransactionManagement
一起添加,手动启用Spring应该为您做的事情。
更多详情here。