【问题标题】:Why my trigger is not working with Hibernate?为什么我的触发器不能与 Hibernate 一起使用?
【发布时间】:2020-12-20 14:51:25
【问题描述】:

我有一个 Java spring boot 项目,我在这个项目中使用 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)方法时它不起作用。如何将我的触发器与休眠一起使用?

我的触发器定义:

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 (
            ?
        )

【问题讨论】:

  • 请出示您的触发器定义。
  • 也许deleteAll(List<Long> idList) 没有提交事务?方法调用后course 中的行是否被删除?
  • 该方法有效,但它只删除课程而不是 table1_course、table1_course 和 table1_course。 @fantaghirocco
  • 调用deleteAll时显示hibernate生成的SQL
  • 我编辑了问题@A.Alexander

标签: java mysql spring hibernate


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    另一种解决方案是使用 JPA 提供的实体生命周期注释。

    在这种情况下,您正在执行删除操作。所以,你可以使用@PreRemove注解。

    您可以查看一些示例on Baeldung

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-25
      • 2020-10-08
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多