2017-02-17 40 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