2

我已经研究了我遇到的这个问题,并尝试从相应的 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);
}

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

4

1 回答 1

2

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

对于大多数用例,您应该只将关联存储在 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然后你仍然可以在两个表上进行约束。

于 2018-07-05T10:28:03.683 回答