为什么我的触发器不能与hibernate一起工作?

q35jwt9p  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(292)

我有一个javaspring启动项目,我在这个项目中使用hibernate。我有一个 void deleteAll(List<Long> idList) 方法及其查询是 @Query(value = "DELETE c FROM Course c WHERE c.id in :idList", nativeQuery = true) . 我想在每次删除操作后使用触发器。我在mysql中创建了一个触发器,在mysql中尝试时它可以工作,但在调用 void deleteAll(List<Long> idList) 方法。如何将触发器与hibernate一起使用?
我的触发器定义:

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时hibernate生成的sql:

Hibernate: 
    DELETE c 
    FROM
        Course c 
    WHERE
        c.id in (
            ?
        )
fzwojiic

fzwojiic1#

另一种解决方案是使用jpa提供的实体生命周期注解。
在本例中,您正在执行删除操作。所以,你可以用 @PreRemove 注解。
你可以查一些关于baeldung的例子

zzzyeukh

zzzyeukh2#

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

相关问题