java - 删除在数据库中具有外键的 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);
}
关于我做错了什么的任何想法?
解决方案
有很多建议不要像这样使用来自两个方面的关联,这是有充分理由的,因为它们很难保持同步。
对于大多数用例,您应该只将关联存储在 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
然后你仍然可以在两个表上进行约束。
推荐阅读
- python - 我可以在 CMD 中使用自定义命令来运行 python 脚本吗?
- python - AES 加密方法每次返回不同的加密文本
- postgresql - 如何在不将列名添加到 GROUP BY 的情况下重写查询
- mysql - 如何在mysql中使用group by with condition
- python - 带有 __str__ 方法的小井字游戏程序,python 3
- node.js - 未找到模块:错误:无法解析“fs、net、path、util、os ...”
- flutter - 如何在颤动的火焰中添加广告
- javascript - 使用 React Js 实现自定义的 Google 日历?
- c# - XML 大小和 SHA1 哈希计算 - 为什么我看到不同的结果?
- javascript - 关于谷歌表单中带部分导航的动态下拉列表应用脚本的问题