spring-boot - 在 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
解决方案
您需要用@Transactional
. 要符合 JPA javax.transaction.Transactional
,您应该javax.transaction.Transactional
使用org.springframework.transaction.annotation.Transactional
.
请记住,在 JPA 中,一切都与实体状态转换有关。当您修改实体时,hiberante 会更新持久性上下文并定期刷新它。发生这种情况的顺序是:
- OrphanRemovalAction
- AbstractEntityInsertAction
- 实体更新动作
- QueuedOperationCollectionAction
- 集合移除动作
- 集合更新动作
- CollectionRecreateAction
- EntityDeleteAction
所以很自然地,插入和更新在删除之前。当您有执行以下操作的代码时:删除+插入插入实际上将在删除之前执行。在这种情况下,正确的方法是获取和更新。
推荐阅读
- python - django-filter 的 Django N+1 选择问题
- python - JSONDecodeError:期望值:使用负载时的第 1 行第 1 列(字符 0)
- java - 哪种设计模式最适合根据某些条件定义多个数据转换器?
- javascript - how to remove an array element in array of array in js?
- python - 如何在不创建对象的情况下调用 python 的标准库函数?
- java - 未找到媒体类型 = 文本/xml 的 MessageBodyReader
- sql - SQL Server,测试数据库环境的每日还原
- nativescript - 如何使用 imagepicker 选择 ios 图像并在 Nativescript 中显示
- apache-spark - Pyspark 作业队列配置优先级 - spark-submit vs SparkSession.builder
- javascript - 通过 api 端点访问特定项目