【问题标题】:Many to Many Spring Jpa Delete does not work多对多 Spring Jpa 删除不起作用
【发布时间】:2020-04-09 16:44:26
【问题描述】:

我是 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。为什么不从数据库中删除药物?
我已经尝试了很多方法..有人可以帮忙吗?

【问题讨论】:

  • 创建一个从双方删除的事务?
  • 如果我想删除一种药物,我希望它从 user_drug 和 drug 中删除。但购买该药物的用户不应从用户数据库中删除
  • 我的意思是从用户那里删除药物的引用,然后(在事务中)保存用户的状态并从数据库中删除药物。
  • 太棒了!我做到了,现在可以了。非常感谢!

标签: java spring jpa many-to-many


【解决方案1】:

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

对于这种情况,有很多解决方案,其中之一是在删除 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;

 }

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 2015-09-05
    • 1970-01-01
    • 2020-04-12
    • 2017-02-24
    • 2021-03-27
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多