我可以在Java 8 forEach循环中使用Spring Data JPA存储库吗?它是线程安全吗?
public interface MajorModOptRepository extends CrudRepository<MajorModOpt, Long> {
Set<MajorModOpt> findManyByManCodeAndModCode(String manCode, String modCode);
}
这是forEach循环:
@Component
public class MajorModOptsHelper {
@Autowired
private MajorModOptRepository majorModOptRepository;
public void setMajorOpts(@NonNull List<Vehicle> vehicles) {
vehicles.forEach(this::setMajorOpts);
}
// This method is called by above forEach
public void setMajorOpts(Vehicle vehicle) {
...
// Repository method is called here
Set<MajorModOptVO> knownOpts = majorModOptRepository.findManyByManCodeAndModCode(vehicle.getManCode(), vehicle.getModCode());
...
}
}
提前谢谢。
答案 0 :(得分:3)
踩踏保存。没有涉及多线程。
你应该注意的唯一事情就是不要为每个findManyByManCodeAndModCode
打开一个新的交易(除了你想要的)。解决此问题的最简单方法是在@Transactional
方法中添加setMajorOpts(@NonNull List<Vehicle> vehicles)
。
答案 1 :(得分:2)
使用当前的forEach
实现或传统的for-loop
,您的代码是线程安全的。
您应该担心事务边界(通过编程或通过@Transactional
划分实现),因为从概念上讲,您将List<Vehicle>
save
操作拆分为两种方法。如果其中一个Vehicle
save
操作失败,会发生什么?使用默认Propagation.REQUIRED,整个操作将被回滚,而如果您的第二个每辆车save
操作是Propagation.REQUIRES_NEW,那么之前的所有失败前Vehicle
都会有通过(=承诺)。