Hibernate ManyToOne OneToMany каскадное удаление зависимых сущностей

В проекте существуют сущности Account и Services (абстрактный). У Services есть дочерний класс Deposit. Код класса Account:

@Entity
public class Account {
  private static Logger log = LogManager.getLogger(Account.class);

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;
  @Column
  private double amount;
  @Column
  private AccountType type;
  @Column(name = "date_start")
  private Date dateStart;
  @Column(name = "date_end")
  private Date dateEnd;
  @Column(name = "in_rate")
  private short inRate;
  @ManyToOne
  @JoinColumn(name = "client_id")
  private Client client;
...

Код класса Services:

@MappedSuperclass
abstract public class Services {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  protected long id;
  @ManyToOne(cascade=CascadeType.ALL)
  @JoinColumn(name = "from_acc_id")
  protected Account fromAcc;
...

У Deposit в дополнение есть поле amount, но это не столь важно. При попытке удаления экземпляра Account, на которую есть ссылки из Deposit, выдаёт ошибку:

2020-03-13 13:29:51 ERROR SqlExceptionHelper:131 - ОШИБКА: UPDATE или DELETE в таблице "account" нарушает ограничение внешнего ключа "fk8qcea1frw0og19kft1ltq9kf9" таблицы "deposit"
Подробности: На ключ (id)=(1) всё ещё есть ссылки в таблице "deposit".

Как настроить каскадное удаление так, чтобы при удалении записи account записи из deposit удалялись автоматически?


Ответы (1 шт):

Автор решения: JackHuman

В общем итоге помогла аннотация @OnDelete. Класс Account не изменял. Код Services:

@MappedSuperclass
abstract public class Services {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  protected long id;
  @ManyToOne(cascade = CascadeType.REFRESH)
  @JoinColumn(name = "from_account_id")
  @OnDelete(action = OnDeleteAction.CASCADE)
  protected Account fromAcc;
...
→ Ссылка