2017-02-17 32 views
2

流,我不知道为什么,当我在控制器改变实体它被保存在数据库中。它看起来像控制器有一个交易。当我在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(); 
     } 
    } 
+0

你有没有定义的'OpenEntityManagerInViewFilter'无论是作为你的自动配置或定制配置的一部分吗? – Naros

+0

不,我没有定义OpenEntityManagerInViewFilter – user249115

回答

1

春天开机后会自动注册一个OpenEntityManagerInViewInterceptor

  • 你有一个Web应用程序
  • 使用JPA

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

要禁止这种行为,你需要配置以下属性:

spring.jpa.open-in-view=false