首页 > 解决方案 > JPA:SQL 脚本的级联应该反映在实体中吗?

问题描述

我有两个实体:coursecategory注释关联@ManyToMany

@Entity
@Table(name = "categories")
public class Category {
    @Id
    @GeneratedValue(generator = "inc")
    @GenericGenerator(name = "inc", strategy = "increment")
    private int categoryId;
    private String name;

    @ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(
            name="course_category",
            joinColumns = @JoinColumn(name = "category_id"),
            inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private Set<Course> courses;
}
@Entity
@Table(name = "courses")
public class Course {
    @Id
    @GeneratedValue(generator = "inc")
    @GenericGenerator(name = "inc", strategy = "increment")
    private int courseId;
    @NotBlank(message = "Add the course's title!")
    private String title;
    private String description;

    @ManyToMany(mappedBy = "courses")
    private Set<Category> categories;
}

我的目标是删除一个类别后,与该类别相关的课程不会被删除,只有关联必须被打破所以我ON DELETE CASCADE在创建连接表时包含。

  CREATE TABLE course_category (
    category_id INT NOT NULL,
    course_id INT NOT NULL,
    FOREIGN KEY (category_id)
        REFERENCES categories(category_id)
        ON DELETE CASCADE,
    FOREIGN KEY (course_id)
        REFERENCES courses(course_id)
        ON DELETE CASCADE
    PRIMARY KEY (category_id, course_id)
)

如果我没有错,它应该达到我的目标。但现在我的问题是:我应该反映ON DELETE CASCADE在我的实体中吗?如果是这样,我该怎么做?通过添加 CascadeType.REMOVE?

标签: jpamany-to-manycascade

解决方案


您应该避免on delete cascade使用 JPA,因为这样数据库将删除可能仍存在于 JPA 持久性上下文中的行。

而是使用CascadeType.REMOVE和/或orphanRemoval=true级联 JPA 删除操作。


推荐阅读