我有两个实体类:帐户和角色。这些映射为多对多关系。我想从数据库中删除一个帐户。下面的代码对我有用,但是,我相信有更好的方法。
我的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中的映射
下面的代码工作正常,哪种方法更好?
@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);
}
答案 0 :(得分:1)
如果您添加CascadeType.REMOVE
,就像@JonathanJohx提到的那样。您可以像这样删除它:
accountRepository.deleteById();
此外,如果要从帐户中删除角色,请在关系的另一端添加CascadeType.REMOVE
,以便执行此操作:
Role role = roleRepository.findById(10);
Account account = accountRepository.findById(11);
account.getRoles().remove(role);