gpt4 book ai didi

java - 多对多 Spring Jpa 删除不起作用

转载 作者:行者123 更新时间:2023-12-01 17:30:44 25 4
gpt4 key购买 nike

我是 Spring jpa 的新手,我正在尝试对 spring jpa 多对多数据库执行删除操作。我的数据库有用户和药物。我可以删除用户并从 user_drug 表中删除与其关联的行,我可以删除没有链接到 user_drug 表的药物,但我无法删除也在 user_drug 表中的药物。我查看了此页面,但那里的解决方案对我不起作用.. How to remove entity with ManyToMany relationship in JPA (and corresponding join table rows)?

这是我的用户实体代码:

 @ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@JoinTable(name = "user_drug",
joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "drug_id", referencedColumnName = "id"))
private Set<Drug> drugs = new HashSet<>();

这是药物实体的代码:

 @ManyToMany(mappedBy = "drugs",  fetch=FetchType.EAGER)
private Set<User> users = new HashSet<>();

这是 DrugServiceImpl 的删除方法:

public void delete(Drug drug)
{
drug.getUsers().clear();
drugRepository.delete(drug);
}

清除操作后我还打印了drug.getUsers()的大小,它是0。为什么它没有从数据库中删除该药物?
我尝试了很多方法..有人可以提供一些帮助吗?

最佳答案

这就是级联的工作原理,它仅从关系表中删除,在ManyToMany中,这里的关系表是user_drug

对于这种情况,有很多解决方案,其中之一是在删除用户的同一事务中删除药物

但另一种解决方案可以节省您创建 ManyToMany 表作为实体并将级联放在关系表中的 drug 对象上的工作

像这样

但这在User实体中

@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="user")
private Set<UserDrug> drugs = new HashSet<>();

UserDrug 实体

public class UserDrug {
@ManyToOne
@JoinColumn(name="user_id")
User user;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="drug_id")
Drug drug;

}

关于java - 多对多 Spring Jpa 删除不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61126074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com