jpa - JPA:SQL 脚本的级联应该反映在实体中吗?
问题描述
我有两个实体:course
由category
注释关联@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?
解决方案
您应该避免on delete cascade
使用 JPA,因为这样数据库将删除可能仍存在于 JPA 持久性上下文中的行。
而是使用CascadeType.REMOVE
和/或orphanRemoval=true
级联 JPA 删除操作。
推荐阅读
- typescript - 如何在 Angular 5 项目中启用 gzip
- python - 当网络完全收敛时停止 Keras 训练
- triggers - Hybris cron 作业手册开始 ingores nodeGroup 设置
- bigcommerce - 大型商务使用车把添加活动类
- java - ProGuard 是否支持 Java 11?
- c++ - 隐藏 constexpr 变量
- spring - 如何定义 JPA 实体类以通过查询加载(不是表中的所有记录)
- java - 在kafka中消费批处理时如何部分commitSync
- php - 如何在 PHP 中给类方法起别名?
- python-3.x - 如何在 LDA 中将令牌与 sklearn 一起使用