【问题标题】:Why controller has transaction when stream on collection为什么控制器在收集流时有事务
【发布时间】:2017-07-07 03:30:58
【问题描述】:

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

我的弹簧控制器

  @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();
        }
    }

【问题讨论】:

  • 您是否在自动配置或自定义配置中定义了 OpenEntityManagerInViewFilter
  • 不,我没有定义 OpenEntityManagerInViewFilter

标签: spring hibernate spring-boot transactional


【解决方案1】:

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

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

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

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

spring.jpa.open-in-view=false

【讨论】:

    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多