Каскад гибернации удаляет зависимые объекты (ManyToOne OneToMany) - PullRequest
0 голосов
/ 13 марта 2020

В проекте есть объекты Account и Services (аннотация). Услуги есть детский класс, депозит. Код класса учетной записи:

@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;
...

Код класса услуг:

@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;
...

В дополнение к вкладу есть поле суммы, но это не так важно:

@Entity
public class Deposit extends Services {
  @Column
  private double amount;

При попытке удалить экземпляр Account, на который есть ссылки из Deposit, выдает ошибку:

2020-03-13 13:29:51 ERROR SqlExceptionHelper: 131 - ERROR: UPDATE or DELETE in the "account" table violates the foreign key constraint "fk8qcea1frw0og19kft1ltq9kf9" of the "deposit" table
Details: The key (id) = (1) still has links in the "deposit" table.

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

1 Ответ

1 голос
/ 16 марта 2020

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

@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;
...
...