Нарушение ограничения ссылочной целостности при удалении в спящем режиме во многих отношениях со многими - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь использовать Hibernate для удаления объекта, однако я получаю сообщение об ошибке: Cannot delete or update a parent row: a foreign key constraint fails

Установка состоит в том, что у меня есть абстрактный класс A и два класса (B и C), которые расширяются A. B содержит список C (однонаправленное отношение). И есть функция для удаления A по ее идентификатору.

Примечание: Материал был удален для краткости.

@Entity
public class B extends A {
  @ManyToMany(fetch = FetchType.EAGER)
  @JoinTable(
        joinColumns = @JoinColumn(name = "B_A_id"),
        inverseJoinColumns = @JoinColumn(name = "C_A_id"))
  List<C> cList;
}

@Entity
public class C extends A {

  (no reference to B)

}

Проблема заключается в том, что когда вызывается deleteAByFixedId, где A является C, он пытается удалить C, прежде чем удаляет B, который ссылается на него, и поэтому я получаю ошибку ограничения внешнего ключа.

Что я делаю неправильно?

1 Ответ

1 голос
/ 08 января 2020

Ответ по-прежнему будет обновляться.

Ссылки:

  1. Лучший способ использовать аннотацию @ManyToMany с JPA и Hibernate
  2. Отображение Hibernate-наследования

@ ManyToMany

Unidirectional пример:

Пользователь. java

@Entity
public class User {

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private long id;

    ...

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles = new HashSet<>();

    public void addRoles(Role role) {
        roles.add(role);
    }

    public void removeRoles(Role role) {
        roles.remove(role);
    }
}

Роль. java

@Entity
public class Role {

    @Id
    @GeneratedValue
    @Column(name = "role_id")
    private int id;

    @Column(name = "role")
    private String role;
}



Bidirectional пример:

Трейдер. java:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ToString(exclude = "stockmarkets")
@Table(name = "trader")
public class Trader {

    @Id
    @GeneratedValue
    @Column(name = "trader_id")
    private Long id;

    @Column(name = "trader_name")
    private String traderName;

    @ManyToMany(fetch = FetchType.LAZY,
            cascade = {
            CascadeType.PERSIST,
            CascadeType.MERGE
    })
    @JoinTable(name = "TRADER_STOCKMARKET",
            joinColumns = { @JoinColumn(name = "trader_id") },
            inverseJoinColumns = { @JoinColumn(name = "stockmarket_id") })
    private Set<Stockmarket> stockmarkets = new HashSet<>();


    /*
    We need to add methods below to make everything work correctly
     */

    public void addStockmarket(Stockmarket stockmarket) {
        stockmarkets.add(stockmarket);
        stockmarket.getTraders().add(this);
    }

    public void removeStockmarket(Stockmarket stockmarket) {
        stockmarkets.remove(stockmarket);
        stockmarket.getTraders().remove(this);
    }

}

Фондовый рынок. java

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@ToString(exclude = "traders")
@Table(name = "stockmarket")
public class Stockmarket{

    @Id
    @GeneratedValue
    @Column(name = "stockmarket_id")
    private Long id;

    @Column(name = "stockmarket_name")
    private String stockmarketName;

    @ManyToMany(mappedBy="stockmarkets")
    private Set<Trader> traders = new HashSet<>();

    /*
    We need to add methods below to make everything work correctly
     */

    public void addTrader(Trader trader) {
        traders.add(trader);
        trader.getStockmarkets().add(this);
    }

    public void removeTrader(Trader trader) {
        traders.remove(trader);
        trader.getStockmarkets().remove(this);
    }

}

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