[英]Deleting Hibernate entity that has a foreign key in database
我已經研究了我遇到的這個問題,並嘗試從相應 Account Hibernate 類中的 Set 中刪除 AccountBalance,然后保存 Account 對象,但數據庫沒有更新。
我想使用 Hibernate 從數據庫中刪除 AccountBalance 記錄。 一個 Account 可以有多個 AccountBalance,但是一個 AccountBalance 只能有一個 Account。
我正在使用一個存儲庫類,它擴展了CrudRepository
將 Hibernate 實例保存到數據庫中相應的表中。 我曾嘗試在要delete()
的 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);
}
關於我做錯了什么的任何想法?
有很多建議不要像這樣使用來自兩個方面的關聯,這是有充分理由的,因為它們很難保持同步。
對於大多數用例,您應該只將關聯存儲在 AccountBalance 中,因此您只需在其中保存 1 個外鍵(到 Account)。 將一些方法添加到您的 AccountBalance 存儲庫以按 Account 和任何其他字段查找 AccountBalance 非常簡單。 這些甚至是自動生成的,即您只需編寫public AccountBalance findByAccountAndBalanceCode(Account account, String balanceCode);
並且該方法已經實現。 雖然您也可以在方法上使用 @Query 注釋編寫自己的查詢。
以同樣的方式,如果您需要將其顯示給用戶,您可以只找到屬於一個帳戶的所有 AccountBalance。 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
,然后您仍然可以約束兩個表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.