java - 删除多对一关系不持久
问题描述
我正在尝试从多对一关系中删除一个实体。它没有抛出任何错误,但似乎该项目没有被删除,我不知道为什么。这些是我的课:
客户实体:
public class Client extends BaseEntity<Long> {
private String name;
private String email;
private LocalDate dateOfBirth;
private LocalDate dateOfRegister;
@OneToMany(mappedBy = "client", cascade = CascadeType.ALL, fetch =
FetchType.EAGER)
private Set<Rental> rentals = new HashSet<>();
..............
}
电影实体:
public class Movie extends BaseEntity<Long>{
private String title;
private int year;
private int duration;
private String genre;
private double imdbRating;
private String trailerLink;
@OneToMany(mappedBy = "movie", cascade = CascadeType.ALL, fetch =
FetchType.EAGER)
private Set<Rental> rentals = new HashSet<>();
..................
}
出租(链接)实体:
public class Rental implements Serializable {
@Id
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "movie_id")
private Movie movie;
@Id
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "client_id")
private Client client;
@Column(name = "dateRented")
private LocalDate dateRented;
@Column(name = "dateDue")
private LocalDate dateDue;
.............
}
主键类:
public class RentalPK implements Serializable {
private Movie movie;
private Client client;
}
在控制器中,我执行以下操作:
@Override
public void deleteRental(RentalPK rentalPK) {
try {
rentalRepository.deleteById(rentalPK);
} catch (Exception e) {
throw e;
}
}
有人可以解释为什么它不删除吗?
解决方案
解决了!似乎是因为 Movie 和 Client 实体中的 CascadeType.ALL。似乎 CascadeType.ALL 还包含 CascadeType.PERSIST,它表示链接实体(在我的情况下是租用的)只能从父级中删除。所以我通过替换为解决了这个CascadeType.ALL
问题CascadeType.REMOVE
。
编辑:我不知道这是否是确切的解释,但它有效。
推荐阅读
- c++ - 如果命令的结果很长,`boost::process::child` 将挂起
- c++ - 如何退出注入进程的dll中的窗口过程?
- python - 使用 winapps 模块打印外部应用程序的安装路径
- numbers - 在 Apple Numbers 中将多个表中的数据动态添加到一个表中
- r - 什么正则表达式函数有助于将数字添加到现有数字?
- javascript - 推入数组的 MongoDB(猫鼬)忽略了属性
- c++ - 通过将迭代器保存到其初始状态的最后一个元素来反转更新的向量
- javascript - 为什么我得到参考错误,我的代码有什么问题?
- python - {foo:>7f} 在 Python f 字符串中做了什么?
- css - 如何使 CSS 绘图始终在每个屏幕中固定显示?