我有一个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 (
?
)
2条答案
按热度按时间fzwojiic1#
另一种解决方案是使用jpa提供的实体生命周期注解。
在本例中,您正在执行删除操作。所以,你可以用
@PreRemove
注解。你可以查一些关于baeldung的例子
zzzyeukh2#
你怎么知道它不起作用?您不会看到触发器的delete查询记录在应用程序中,这只发生在dbms端。如果你有
EntityManager
如果包含已删除的实体或触发器删除的关联,则必须将它们从EntityManager
为了再次获得一致的视图,hibernate不知道dml语句对托管实体有什么影响。尝试使用EntityManager.clear
在执行这个dml语句之后。