java - 为什么我的触发器不能与 Hibernate 一起使用?
问题描述
我有一个 Java spring boot 项目,我在这个项目中使用 Hibernate。我有一个void deleteAll(List<Long> idList)
方法,它的查询是@Query(value = "DELETE c FROM Course c WHERE c.id in :idList", nativeQuery = true)
. 我想在每次删除操作后使用触发器。void deleteAll(List<Long> idList)
我在mysql中创建了一个触发器,当我在mysql中尝试时它可以工作,但是当我调用方法时它不起作用。如何将我的触发器与休眠一起使用?
我的触发器定义:
DELIMITER $$
CREATE TRIGGER after_delete_course AFTER DELETE ON course FOR EACH ROW
BEGIN
DELETE tc1 FROM table1_course tc1 WHERE tc1.course_id = OLD.id;
DELETE tc2 FROM table2_course tc2 WHERE tc2.course_id = OLD.id;
DELETE tc3 FROM table3_course tc3 WHERE tc3.course_id = OLD.id;
END$$
DELIMITER ;
调用 deleteAll 时休眠生成的 SQL:
Hibernate:
DELETE c
FROM
Course c
WHERE
c.id in (
?
)
解决方案
你怎么知道它不起作用?您不会看到触发器的删除查询记录在您的应用程序中,这只发生在 DBMS 端。如果您有一个EntityManager
包含已删除的实体或触发器删除的关联,则必须将它们从 中分离EntityManager
以再次获得一致的视图,因为 Hibernate 不知道 DML 语句将对托管实体产生什么影响。EntityManager.clear
执行此 DML 语句后尝试使用。
推荐阅读
- docker - Google Cloud Platform 中的计划自动扩缩作业
- html - 响应式设计无法正常工作 - 显示太多
- php - PHP MySqli 如何从我不知道名称的表中选择所有内容?
- isabelle - 在 Isabelle 中重用 AFP 条目的正确方法
- mysql - 将数据从csv导入mysql时出现问题
- regex - 通过将两个正则表达式模式与 AND 条件组合来创建一个过滤器
- ios - 试图在 ARSCNView 上运行视图的动画
- java - 从字节数组中获取一系列位
- java - 使用 Android Presentation Class 在辅助屏幕上显示视频
- generics - 为所有原始整数类型定义功能的惯用方式