Удаление объекта Hibernate, который имеет внешний ключ в базе данных - PullRequest
0 голосов
/ 05 июля 2018

Я уже изучил эту проблему и пытался удалить AccountBalance из набора в соответствующем классе Hibernate, а затем сохранить объект Account, но база данных не обновляется.

Я хочу удалить запись AccountBalance из базы данных, используя Hibernate. У учетной записи может быть много учетных записей, но у учетной записи может быть только одна учетная запись.

Я использую класс репозитория, который расширяет CrudRepository для сохранения экземпляров Hibernate в соответствующих таблицах в базе данных. Я попытался использовать функцию delete() специально для AccountBalance, который я хочу удалить, но это не работает.

Вот код Hibernate, который у меня уже есть в AccountBalance:

@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 голосов
/ 05 июля 2018

Существует множество рекомендаций по НЕ использовать ассоциации с двух сторон, как это, по уважительной причине, поскольку их трудно синхронизировать.

В большинстве случаев вы должны просто сохранить связь в AccountBalance, поэтому вы сохраняете там только 1 внешний ключ (в Account). Очень просто добавить какой-либо метод в ваш репозиторий AccountBalance, чтобы найти AccountBalance по аккаунту и любым другим полям. Они даже генерируются автоматически, т.е. вы просто пишете public AccountBalance findByAccountAndBalanceCode(Account account, String balanceCode);, и метод уже реализован. Хотя вы также можете написать свой собственный запрос с аннотацией @Query для метода.

Таким же образом вы можете просто найти все Учетные записи, принадлежащие Учетной записи, если вам нужно отобразить это пользователю. 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>)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...