在 JQPL 查询中执行更新/删除查询

SIn*_*sun 6 jpql spring-data spring-boot

我在 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);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这不起作用。我有这个错误:

javax.persistence.TransactionRequiredException: Executing an update/delete query
Run Code Online (Sandbox Code Playgroud)

hov*_*yan 7

你需要用@Transactional. 要符合 JPA,您应该使用javax.transaction.Transactional,尽管在 spring-data 的某些版本组合中如果javax.transaction.Transactional导致问题,您可以尝试使用org.springframework.transaction.annotation.Transactional.

请记住,在 JPA 中,一切都与实体状态转换有关。当您修改实体时,hiberante 会更新持久性上下文并定期刷新它。发生这种情况的顺序是:

  • 孤儿移除行动
  • 抽象实体插入操作
  • 实体更新操作
  • QueuedOperationCollectionAction
  • 集合移除动作
  • 集合更新动作
  • 集合重新创建操作
  • 实体删除操作

所以自然插入和更新在删除之前。当您有执行以下操作的代码时:删除 + 插入实际上将在删除之前执行插入。在这种情况下,正确的方法是获取和更新。