【发布时间】:2020-01-23 01:36:03
【问题描述】:
我有两个实体类:帐户和角色。这些映射与多对多关系。我想从数据库中删除一个帐户。下面的代码对我有用,但是,我相信有更好的方法。
我的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 中的映射
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);
}
【问题讨论】:
-
在
Role关系中添加cascade = { ...., ...., CascadeType.REMOVE},然后仅使用accountRepo.deleteById(accountId);并将被删除。
标签: java spring hibernate spring-boot many-to-many