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

时间:2019-09-23 01:29:29

标签: java spring hibernate spring-boot many-to-many

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

我的Account.class

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<>();

}

我的Role.class

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中的映射

Db map pic

TL; DR

下面的代码工作正常,哪种方法更好?

@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);
    }

1 个答案:

答案 0 :(得分:1)

如果您添加CascadeType.REMOVE,就像@JonathanJohx提到的那样。您可以像这样删除它:

accountRepository.deleteById();

此外,如果要从帐户中删除角色,请在关系的另一端添加CascadeType.REMOVE,以便执行此操作:

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