В приложении я использую Spring Data и Hibernate. База данных HSQLDB.
Есть таблицы
students и
сourses, связанные отношением ManyToMany. Эти отношения хранятся в таблице
students_courses:
CREATE TABLE students
(
id INTEGER GENERATED BY DEFAULT AS SEQUENCE global_seq PRIMARY KEY,
name VARCHAR(255) NOT NULL,
);
CREATE TABLE courses
(
id INTEGER GENERATED BY DEFAULT AS SEQUENCE global_seq PRIMARY KEY,
name VARCHAR(255) NOT NULL,
);
CREATE TABLE students_courses
(
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
FOREIGN KEY (student_id) REFERENCES students (id),
FOREIGN KEY (course_id) REFERENCES courses (id) ON DELETE CASCADE
);
Я хочу, чтобы нельзя было удалить студента, который уже участвует в каких-то курсах. Именно поэтому вот здесь:
FOREIGN KEY (student_id) REFERENCES students (id)
отсутствует ON DELETE CASCADE.
Я пытаюсь удалить студента с курсами из консоли HSQLDB и получаю ожидаемую ошибку:
integrity constraint violation: foreign key no action; SYS_FK_10323 table: students_courses. То есть всё работает нормально. Но когда я пытаюсь удалить студента при помощи вызова
delete()
вот в таком репозитории:
@Repository
@Transactional(readOnly = true)
public interface StudentRepository extends JpaRepository<Student, Integer> {
@Transactional
@Modifying
@Query("DELETE FROM Student s WHERE s.id=:id")
int delete(@Param("id") int id);
}
то этот код срабатывает и не бросает ошибку! Причём я проверял - студент реально удаляется, поведение такое, как будто установлен ON DELETE CASCADE, хотя это не так. Как мне заставить Hibernate выбрасывать ошибку и не удалять сущность, на которую ссылается FK?