首页 > 解决方案 > 删除在数据库中具有外键的 Hibernate 实体

问题描述

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

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

我正在使用一个存储库类,它扩展CrudRepository为将 Hibernate 实例保存到数据库中相应的表中。我已经尝试delete()在要删除的 AccountBalance 上专门使用该功能,但这不起作用。

这是我在 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);
}

关于我做错了什么的任何想法?

标签: javaspringhibernatejpahibernate-jpa

解决方案


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

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

以同样的方式,如果您需要将其显示给用户,您可以找到属于某个帐户的所有 AccountBalances。public List<AccountBalance> findByAccount(Account account);你就完成了。

在这种情况下,在 Account 方面根本不需要更新任何东西,如果您删除 AccountBalance,您只会从数据库中删除一条记录。

如果您需要从 Account 方面开始查询,但您在 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然后你仍然可以在两个表上进行约束。


推荐阅读