为什么控制器在收集流时有事务
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
我不知道为什么当我在控制器中更改实体时,它会保存在数据库中。看起来控制器有一个事务。当我在 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