在Java 8 forEach循环中使用Spring Data JPA存储库是否安全可靠?

时间:2016-12-07 19:47:12

标签: java spring java-8 spring-data spring-data-jpa

我可以在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());
        ...
    }
}

提前谢谢。

2 个答案:

答案 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都会有通过(=承诺)。