spring 如何删除ManyToOne JPA对象

xlpyo6sf  于 2023-01-12  发布在  Spring
关注(0)|答案(3)|浏览(203)

我正在尝试删除子类的对象,而不调用父类,所以没有必要在2个请求数据库。你能帮助解决这个问题,并解释如何解决这个问题。
父类:

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<License> licenses;

子类:

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "user_id", referencedColumnName = "id")
private Person user;

正在尝试删除:

@Transactional
public void delete(License license) {
    licenseRepository.delete(license);
}

如果我对子类(许可证)执行CascadeType.ALL,它也会删除父类。我只需要从数据库中删除此许可证

wnavrhmk

wnavrhmk1#

在这里,我可以看到您有一个父类 User 和一个子类 License,它们具有OneToMany双向Map。
此处的“多”端表示在许可证实体端,只要您不使用 CascadeType.REMOVE,如果您删除许可证对象,它不会删除用户对象。
这样您就可以直接删除许可条目。它看起来像这样:
许可证存储库对象.delete(要删除的许可证对象);

blpfk2vs

blpfk2vs2#

在使用删除子类之前

@Transactional
   public void delete(License license) {
   license.setUser(null);
  licenseRepository.delete(license);
    }

以便删除父级和子级之间的所有关系

qrjkbowd

qrjkbowd3#

在子类中:编写代码它将只删除子类

@ManyToMany(cascade= {CascadeType.PERSIST, CascadeType.MERGE,
                     CascadeType.DETACH, CascadeType.REFRESH})

在业务实现中:

@Override
    public void deleteLicence(int licenseId,int userId) {
        User user = userRepository.findById(userId).get();
        License license = licenseRepository.findById(licenseId).get();
        user.getLicences().remove(license);
        licenseRepository.delete(license);
        userRepository.save(user);
    }
  • 首先获取许可证和用户的对象
  • 从getLicences()方法获取许可证并删除许可证对象。
  • 然后从存储库中删除许可证
  • 保存用户。

希望你能找到答案。

相关问题