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

no i не определено OpenEntityManagerInViewFilter – user249115

ответ

1

Spring загрузки автоматически зарегистрирует OpenEntityManagerInViewInterceptor, если выполняются следующие условия:

  • у вас есть веб-приложение
  • вы используете JPA

Оба условия верны в вашем случае. Этот перехватчик удерживает диспетчера объектов открытым на весь период выполнения запроса. Автоконфигурация происходит в классе JpaBaseConfiguration.

Чтобы отключить это поведение, необходимо настроить следующее свойство:

spring.jpa.open-in-view=false 
Смежные вопросы