Почему мой триггер не работает с Hibernate?

У меня есть проект весенней загрузки 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 (
            ?
        )

Пожалуйста, покажите свое определение триггера.

SternK 20.12.2020 16:09

Может deleteAll(List<Long> idList) не совершает транзакцию? Строки в course удаляются после вызова метода?

fantaghirocco 20.12.2020 16:21

Метод работает, но удаляет только курсы не table1_course, table1_course и table1_course. @фантагирокко

Muzaffer Arda Uslu 20.12.2020 16:24

Показать SQL, сгенерированный спящим режимом, когда вызывается deleteAll

A.Alexander 20.12.2020 17:32

Я отредактировал вопрос @A.Alexander

Muzaffer Arda Uslu 20.12.2020 21:53
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
0
5
649
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Альтернативным решением является использование аннотаций жизненного цикла объектов, предоставляемых JPA.

В этом случае вы выполняете операцию удаления. Итак, вы можете использовать аннотацию @PreRemove.

Вы можете проверить некоторые примеры на Baeldung

Ответ принят как подходящий

Откуда ты знаешь, что это не работает? Вы не увидите, что запросы на удаление вашего триггера регистрируются в вашем приложении, это происходит только на стороне СУБД. Если у вас есть EntityManager, который содержит удаленный объект или ассоциации, удаленные триггером, вам придется отсоединить их от EntityManager, чтобы снова получить согласованное представление, поскольку Hibernate не знает, какое влияние операторы DML окажут на управляемые объекты. Попробуйте использовать EntityManager.clear после выполнения этого оператора DML.

Другие вопросы по теме