【发布时间】:2023-03-05 22:10:01
【问题描述】:
我的应用程序使用 Hibernate、Spring Data JPA 和 Spring MVC。数据库是 HSQLDB。
有两个实体,学生和课程。他们的关系是多对多。
学生
@Entity
@Table(name = "students")
public class Student {
@ManyToMany(mappedBy = "students")
List<Course> courses;
// other fields
}
课程
@Entity
@Table(name = "courses")
public class Course {
@ManyToMany
@JoinTable(
name = "students_courses",
joinColumns = @JoinColumn(name = "course_id"),
inverseJoinColumns = @JoinColumn(name = "student_id")
)
List<Student> students;
// other fields
}
表格
CREATE TABLE students
(
id INTEGER GENERATED BY DEFAULT AS SEQUENCE global_seq PRIMARY KEY
/* other fields */
);
CREATE TABLE courses
(
id INTEGER GENERATED BY DEFAULT AS SEQUENCE global_seq PRIMARY KEY
/* other fields */
);
CREATE TABLE students_courses
(
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
CONSTRAINT student_course_idx UNIQUE (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students (id) ON DELETE CASCADE,
FOREIGN KEY (course_id) REFERENCES courses (id) ON DELETE CASCADE
);
我用于学生的这个控制器:
@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);
// Other methods
如果学生与一门或多门课程相关联,则无法通过分配移除学生。所以我修复了 student_courses 表:
CREATE TABLE students_courses
(
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
CONSTRAINT student_course_idx UNIQUE (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students (id) /* removed delete cascading */,
FOREIGN KEY (course_id) REFERENCES courses (id) ON DELETE CASCADE
);
好的,更改在这里:FOREIGN KEY (student_id) REFERENCES students (id),我删除了 ON DELETE CASCADE,如果学生与一门或多门课程相关联,则无法删除学生。但是 Hibernate 会忽略它,并且即使学生与课程相关联,也可以轻松删除它们。
我尝试使用ON DELETE NO ACTION,但没有效果。
我想知道为什么 Hibernate 不忽略 ON DELETE SET NULL 并抛出错误。但是为什么 Hibernate 会忽略ON DELETE NO ACTION?我该如何解决?
【问题讨论】:
-
Hibernate 不读取数据库模式,因此它不知道您更改了外键的
ON DELETE选项。要告诉 Hibernate,请在@ManyToMany注释上指定cascade属性。 -
@Andreas 我如何使用级联?我认为
@ManyToMany中的级联和数据库中的级联具有各种功能 -
@Andreas 我希望如果学生与一门或多门课程相关联,则无法移除学生。我该怎么做?
-
@Zhenyria
i want that student removal is not possible- 您想为此操作设置 JDBC 级别的异常吗? -
@SternK 当我尝试删除与一门或多门课程关联的学生时,我想获得例外。例如,当我保存已存在的实体时出现异常
标签: java spring hibernate jpa spring-data-jpa