Выполнение запроса на обновление / удаление в запросе JQPL - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть запрос на вставку в 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

1 Ответ

0 голосов
/ 22 февраля 2019

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

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

  • OrphanRemovalAction
  • AbstractEntityInsertAction
  • EntityUpdateAction
  • QueuedOperationCollectionAction
  • CollectionRemoveAction
  • CollectionRecreateAction
  • EntityDeleteAction

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

...