首页 > 解决方案 > 为什么我的触发器不能与 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 (
            ?
        )

标签: javamysqlspringhibernate

解决方案


你怎么知道它不起作用?您不会看到触发器的删除查询记录在您的应用程序中,这只发生在 DBMS 端。如果您有一个EntityManager包含已删除的实体或触发器删除的关联,则必须将它们从 中分离EntityManager以再次获得一致的视图,因为 Hibernate 不知道 DML 语句将对托管实体产生什么影响。EntityManager.clear执行此 DML 语句后尝试使用。


推荐阅读