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

时间:2018-07-05 10:05:17

标签: java spring hibernate jpa hibernate-jpa

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

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

我正在使用一个扩展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);
}

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

1 个答案:

答案 0 :(得分:1)

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

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

如果需要将其显示给用户,则可以用相同的方式找到一个帐户的所有AccountBalance。 public List<AccountBalance> findByAccount(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>)