jpa之为什么手动定义的 Spring Data JPA 删除查询不会触发级联
你猜
阅读:123
2025-06-02 22:19:02
评论:0
我有以下问题:当我尝试删除具有以下关系的实体时:
@OneToMany(mappedBy="pricingScheme", cascade=CascadeType.ALL, orphanRemoval=true)
private Collection<ChargeableElement> chargeableElements;
与
CrudRepository通过提供的删除方法,它删除了实体及其所有可收费的元素,这很好。当我尝试使用自定义删除时出现问题:
@Modifying
@Query("DELETE FROM PricingScheme p WHERE p.listkeyId = :listkeyId")
void deleteByListkeyId(@Param("listkeyId") Integer listkeyId);
它说:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
Cannot delete or update a parent row: a foreign key constraint fails
(`listkey`.`chargeableelements`, CONSTRAINT `FK_pox231t1sfhadv3vy7ahsc1wt`
FOREIGN KEY (`pricingScheme_id`) REFERENCES `pricingschemes` (`id`))
为什么我不允许这样做?是否
@Query方法不支持级联属性?我知道我可以
findByListkeyId(…)先用标准的删除方法再删除持久化实体,但它是不雅的。是否可以使用自定义
@Query方法是我尝试的方式?
请您参考如下方法:
这与 Spring Data JPA 无关,而是 JPA 指定其工作的方式(第 4.10 节 - “批量更新和删除操作”,JPA 2.0 规范):
A delete operation only applies to entities of the specified class and its subclasses. It does not cascade to related entities.
如果你仔细想想,JPA 级联不是数据库级级联,而是由
EntityManager 维护的级联。 .因此,
EntityManager需要知道要删除的实体实例及其相关实例。如果您触发一个查询,它实际上无法知道这些,因为持久性提供程序将其转换为 SQL 并执行它。所以没有办法
EntityManager可以分析对象图,因为执行完全发生在数据库中。
可以在此处找到与此主题相关的问答 over here .
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



