У меня есть проект весенней загрузки Java, и я использую 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 ;
SQL, сгенерированный спящим режимом при вызове deleteAll:
Hibernate:
DELETE c
FROM
Course c
WHERE
c.id in (
?
)
Может deleteAll(List<Long> idList) не совершает транзакцию? Строки в course удаляются после вызова метода?
Метод работает, но удаляет только курсы не table1_course, table1_course и table1_course. @фантагирокко
Показать SQL, сгенерированный спящим режимом, когда вызывается deleteAll
Я отредактировал вопрос @A.Alexander
Альтернативным решением является использование аннотаций жизненного цикла объектов, предоставляемых JPA.
В этом случае вы выполняете операцию удаления. Итак, вы можете использовать аннотацию @PreRemove.
Вы можете проверить некоторые примеры на Baeldung
Откуда ты знаешь, что это не работает? Вы не увидите, что запросы на удаление вашего триггера регистрируются в вашем приложении, это происходит только на стороне СУБД. Если у вас есть EntityManager, который содержит удаленный объект или ассоциации, удаленные триггером, вам придется отсоединить их от EntityManager, чтобы снова получить согласованное представление, поскольку Hibernate не знает, какое влияние операторы DML окажут на управляемые объекты. Попробуйте использовать EntityManager.clear после выполнения этого оператора DML.
Пожалуйста, покажите свое определение триггера.