簡體   English   中英

刪除在數據庫中具有外鍵的 Hibernate 實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM