Выполнение запроса на обновление/удаление в запросе JQPL

У меня есть запрос на вставку в JPQL следующим образом:

@Modifying
    @Query(value = "insert into Product_Category (product_id, category_id , description , numberOfProduct, image, price ) values (:product_id, :category_id, :description, :numberOfProduct, :image, :price)", nativeQuery = true)
    void insertProduct(@Param("product_id") int product_id, @Param("category_id") int category_id,
            @Param("description") String description, @Param("numberOfProduct") int numberOfProduct,
            @Param("image") String image, @Param("price") int price);

Я не понимаю, почему это не работает. У меня есть эта ошибка:

javax.persistence.TransactionRequiredException: Executing an update/delete query

попробуйте использовать org.springframework.transaction.annotation.Transactional вместо javax.transaction.Transactional

hovanessyan 22.02.2019 09:22

Спасибо, я исправил транзакционную аннотацию: @Transactional @Modifying @Query(value = "insert into Product_Category (product_id, category_id , description , numberOfProduct, image, price ) values (:product_id, :category_id, :description, :numberOfProduct, :image, :price)", nativeQuery = true) void insertUser(@Param("product_id") int product_id, @Param("category_id") int category_id, @Param("description") String description, @Param("numberOfProduct") int numberOfProduct, @Param("image") String image, @Param("price") int prices);

SIn san sun 22.02.2019 09:31

@SInsansun Не стесняйтесь добавлять свой комментарий в качестве ответа, чтобы люди могли проголосовать за него, и вы могли его принять.

g00glen00b 22.02.2019 09:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
6
3
13 512
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно обернуть свои операторы с помощью @Transactional. Чтобы быть совместимым с JPA, вы должны использовать javax.transaction.Transactional, хотя в некоторых версиях комбинация spring-data, если javax.transaction.Transactional вызывает проблемы, вы можете попробовать использовать org.springframework.transaction.annotation.Transactional.

Имейте в виду, что в JPA все дело в переходах между состояниями сущностей. Когда вы изменяете объекты, hiberante обновляет контекст сохранения и периодически сбрасывает его. Порядок, в котором это происходит, следующий:

  • OrphanRemovalAction
  • АбстрактЭнтититиИнсертактион
  • EntityUpdateAction
  • QueuedOperationCollectionAction
  • КоллекцияУдалитьДействие
  • CollectionUpdateAction
  • КоллекцияПересоздатьДействие
  • EntityDeleteAction

Поэтому, естественно, вставки и обновления выполняются перед удалением. Когда у вас есть код, который выполняет: удаление + вставку, вставка будет фактически выполнена перед удалением. В таких случаях правильным способом является выборка и обновление.

вы должны открыть сеанс для опроса с BD

import org.springframework.transaction.annotation.Transactional.

    @Transactional //try to add this annotation 
    @Modifying
    @Query(value = "insert into Product_Category (product_id, category_id , description , numberOfProduct, image, price ) values (:product_id, :category_id, :description, :numberOfProduct, :image, :price)", nativeQuery = true)
    void insertProduct(@Param("product_id") int product_id, @Param("category_id") int category_id,
            @Param("description") String description, @Param("numberOfProduct") int numberOfProduct,
            @Param("image") String image, @Param("price") int price);

Другие вопросы по теме