【问题标题】:Why Hibernate ignore ON DELETE NO ACTION?为什么 Hibernate 忽略 ON DELETE NO ACTION?
【发布时间】: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


【解决方案1】:

StudentRepository 有 Transactional(readOnly = true) 注释,并且你有删除方法。

【讨论】:

  • 和?用 @Transactional 标记的 delete() 没有 readOnly。
  • 我的意思是问题可能是存储库中的 readOnly = true 和 delete()
  • 那么@Transactional (readOnly = true)不是被@Transactional取代了吗?
猜你喜欢
  • 2023-01-24
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多