在 JPQL 查询中执行 update/delete 查询
Executing an update/delete query in the JQPL query
我在 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
,尽管在 spring-data 的某些版本组合中,如果 javax.transaction.Transactional
导致问题,您可以尝试使用 org.springframework.transaction.annotation.Transactional
.
请记住,在 JPA 中,一切都与实体状态转换有关。当您修改实体时,hiberante 会更新 Persistence Context 并定期刷新它。
发生这种情况的顺序是:
- 孤儿移除行动
- AbstractEntityInsertAction
- 实体更新操作
- QueuedOperationCollectionAction
- CollectionRemoveAction
- 集合更新操作
- CollectionRecreateAction
- 实体删除操作
所以插入和更新自然是在删除之前。
当您有执行以下操作的代码时:删除+插入实际上将在删除之前执行插入。在这种情况下,正确的方法是获取和更新。
你必须打开一个会话来询问 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);
我在 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
,尽管在 spring-data 的某些版本组合中,如果 javax.transaction.Transactional
导致问题,您可以尝试使用 org.springframework.transaction.annotation.Transactional
.
请记住,在 JPA 中,一切都与实体状态转换有关。当您修改实体时,hiberante 会更新 Persistence Context 并定期刷新它。 发生这种情况的顺序是:
- 孤儿移除行动
- AbstractEntityInsertAction
- 实体更新操作
- QueuedOperationCollectionAction
- CollectionRemoveAction
- 集合更新操作
- CollectionRecreateAction
- 实体删除操作
所以插入和更新自然是在删除之前。 当您有执行以下操作的代码时:删除+插入实际上将在删除之前执行插入。在这种情况下,正确的方法是获取和更新。
你必须打开一个会话来询问 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);