为什么控制器在收集流时有事务

Why controller has transaction when stream on collection

我不知道为什么当我在控制器中更改实体时,它会保存在数据库中。看起来控制器有一个事务。当我在 for 循环中设置 属性 时,它没有保存在数据库中。

我的spring控制器

  @RestController
    public class CartController {
        @Autowired
        DeliveryTypeRepository deliveryTypeRepository;

        @GetMapping("/cartStepTwoAction")
        public ModelAndView cartStepTwoAction() {
            List<DeliveryType> dtList = deliveryTypeRepository.findAll();
            dtList.stream().forEach(x -> x.setPriceBrutto(new BigDecimal(44)));
            // why dirty checking save change ?

            ...

            ModelAndView model = new ModelAndView();
            return model;
        }

    }

,和存储库

 @Repository
    public class DeliveryTypeRepositoryImpl implements DeliveryTypeRepository {

        @PersistenceContext
        EntityManager em;

        @Override
        public List<DeliveryType> findAll() {

                    String sql = "SELECT e FROM DeliveryType e";
                    Query query = em.createQuery(sql);
                    return query.getResultList();
        }
    }

Spring 当满足以下条件时,启动会自动注册一个OpenEntityManagerInViewInterceptor

  • 您有一个网络应用程序
  • 您使用 JPA

在您的情况下,这两个条件都成立。该拦截器在整个请求期间保持实体管理器处于打开状态。自动配置发生在 class JpaBaseConfiguration.

要禁用该行为,您需要配置以下内容属性:

spring.jpa.open-in-view=false