Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate中删除多对多关系中的实体_Java_Spring_Hibernate_Spring Boot_Many To Many - Fatal编程技术网

Java 如何在Hibernate中删除多对多关系中的实体

Java 如何在Hibernate中删除多对多关系中的实体,java,spring,hibernate,spring-boot,many-to-many,Java,Spring,Hibernate,Spring Boot,Many To Many,我有两个实体类:Account和Role。这些被映射为多对多关系。我想从数据库中删除一个帐户。下面的代码对我很有用,但是,我相信有更好的方法 我的帐户.类别: public class Account { //some code @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) @JoinTable(name = "account_

我有两个实体类:Account和Role。这些被映射为多对多关系。我想从数据库中删除一个帐户。下面的代码对我很有用,但是,我相信有更好的方法

我的
帐户.类别

public class Account {

    //some code

    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinTable(name = "account_role",
            joinColumns = {@JoinColumn(name = "account_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")})
    private Set<Role> roles = new HashSet<>();

}
public class Role {

    //some code

    @EqualsAndHashCode.Exclude
    @ManyToMany(mappedBy = "roles", fetch = FetchType.EAGER,
             cascade = {CascadeType.MERGE , CascadeType.PERSIST/*, CascadeType.DETACH, CascadeType.REFRESH*/})
    private Set<Account> accounts = new HashSet<>();
}
这是我在PostgreSQL中的映射

TL;博士 下面的代码运行良好,有什么更好的方法

@Override
public void deleteUserAndHisTokensById(Long accountId) {
    Account accountToBeDelete = accountRepository.findDistinctById(accountId);
    accountToBeDelete.getRoles()
            .forEach(role -> {
                Set<Account> updatedAccounts = role.getAccounts()
                        .stream()
                        .filter(account -> !account.equals(accountToBeDelete))
                        .collect(Collectors.toSet());
                role.setAccounts(updatedAccounts);
                roleRepository.save(role);
            });
     
        accountToBeDelete.setRoles(null);
        accountRepository.deleteById(accountId);
    }
@覆盖
public void deleteUserAndHistoryKensById(长帐户ID){
Account accountToBeDelete=accountRepository.FindDistincById(accountId);
accountToBeDelete.getRoles()
.forEach(角色->{
Set updateAccounts=role.getAccounts()
.stream()
.filter(account->!account.equals(accountToBeDelete))
.collect(收集器.toSet());
角色。设置帐户(更新的帐户);
角色还原。保存(角色);
});
accountToBeDelete.setRoles(空);
accountRepository.deleteById(accountId);
}

如果您添加了
级联类型。请删除
,就像前面提到的@JonathanJohx一样。您可以按如下方式删除它:

accountRepository.deleteById();
此外,如果要从帐户中删除角色,请将
CascadeType.remove
添加到关系的另一端,以便执行以下操作:

Role role = roleRepository.findById(10);
Account account = accountRepository.findById(11);
account.getRoles().remove(role);

Role
关系中添加
cascade={….,…..,CascadeType.REMOVE}
,然后只使用
accountRepo.deleteById(accountId)
和将被删除。感谢您的提醒,因此这是
投票结果
:)这看起来很奇怪,但添加cascade remove并不能帮助我处理这件事。我在帐户上试用->如果我删除了帐户,它会工作并删除帐户和角色。如果我只调用accountRepo.deleteDistinctById(someId),那么在添加角色的情况下,REMOVE cascade什么也不做;在我的帖子里,为提高英语水平等写了一篇文章