@JackHuman

Как реализовать в 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 удалялись автоматически?
  • Вопрос задан
  • 1957 просмотров
Решения вопроса 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;
...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@ads83
Насколько я помню, если в `Services` ты указал `@ManyToOne Account`, то в `Account` обязан указать `@OneToMany Services`.
Прописывать настройки каскадности нужно только в одном классе. Вот похожий вопрос на английском.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы