删除在数据库中具有外键的 Hibernate 实体

Deleting Hibernate entity that has a foreign key in database

我已经调查了我遇到的这个问题,并尝试从相应的 Account Hibernate class 中的 Set 中删除 AccountBalance,然后保存 Account 对象,但数据库没有更新.

我想使用 Hibernate 从数据库中删除 AccountBalance 记录。一个Account可以有多个AccountBalance,但是一个AccountBalance只能有一个Account。

我正在使用存储库 class,它扩展了 CrudRepository 以将 Hibernate 实例保存到它们在数据库中的相应表中。我已经尝试在我想删除的 AccountBalance 上专门使用 delete() 函数,但这不起作用。

这是我在 AccountBalance 中已有的 Hibernate 代码:

@Entity
@Table(name = "account_balance")
public class AccountBalance {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "acc_id", nullable = false)
private Account account;

和帐户:

@Entity
@Table(name = "account")
public final class Account {

@OneToMany(fetch = FetchType.EAGER, mappedBy = "account", cascade = CascadeType.ALL)
private Set<AccountBalance> balances = new HashSet<>();

我已经尝试过此功能,但没有用。

public void deleteAccountBalance(Account account, String balanceCode) {
    for (Iterator<AccountBalance> iterator = account.getBalances().iterator(); iterator.hasNext();) {
        AccountBalance accBal =  iterator.next();
        if (accBal.getBalanceCode().equals(balanceCode)) {
            iterator.remove();
        }
    }
    accountRepository.save(account);
}

对我做错了什么有什么想法吗?

有很多建议不要像这样使用来自 2 个方面的关联,这是有充分理由的,因为它们很难保持同步。

对于大多数用例,您应该只将关联存储在 AccountBalance 中,因此您只在其中保存 1 个外键(到帐户)。将一些方法添加到您的 AccountBalance 存储库以按帐户和任何其他字段查找 AccountBalance 非常简单。这些甚至是自动生成的,即您只需编写 public AccountBalance findByAccountAndBalanceCode(Account account, String balanceCode); 并且该方法已经实现。尽管您也可以在方法上使用 @Query 注释编写自己的查询。

以同样的方式,如果您需要向用户显示,您可以找到属于一个帐户的所有帐户余额。 public List<AccountBalance> findByAccount(Account account); 大功告成。

在这种情况下,在 Account 方面根本没有什么可更新的,如果您删除 AccountBalance,您只会从数据库中删除一条记录。

如果您需要从帐户方面开始查询,但您在 AccountBalances 中查询某些条件,您仍然可以执行 select a from Account a where exists (select AccountBalance ab from AccountBalance where ab.account = a and <insert some AccountBalance constraint>)

尽管为了获得更好的性能,我建议使用连接,例如 select a from AccountBalance ab inner join ab.account a,然后您仍然可以对两个表进行约束。