Spring Data JPA удалить от многих ко многим проблема отношений - PullRequest
1 голос
/ 25 мая 2020

В своем проекте я использую данные Spring jpa. У меня есть таблицы для отношений "многие ко многим". Мои объекты:

    @Entity
    @Table(name = "SPEC")
    public class SpecJpa {
        @Id
        private int id;
        @Column(name = "NAME")
        private String name;
        @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
        @JoinColumn(name = "Creator_ID", unique = false, nullable = false, updatable = true)
        private UsersJpa usersJpa;
        @Column(name = "DESCRIPTION")
        private String description;


        @ManyToMany(fetch = FetchType.EAGER)
        @JoinTable(name="SPEC_PARTS",
                joinColumns = @JoinColumn(name="ID_PARTS", referencedColumnName="id"),
                inverseJoinColumns = @JoinColumn(name="ID_SPEC", referencedColumnName="id")
        )
    private Set<PartsJpa> partsJpa;
    //---------------

И части:

@Entity
@Table(name = "PARTS")
public class PartsJpa {
    @Id
    private int id;
    @Column(name = "NAME")
    private String name;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "ID_EXPORT", unique = false, nullable = false, updatable = true)
    private ExportJpa exportJpa;
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "ID_TYPE", unique = false, nullable = false, updatable = true)
    private TypesJpa typesJpa;

    @Column(name = "DESCRIPTION")
    private String description;

    @ManyToMany(fetch = FetchType.EAGER)

    private Set<SpecJpa> specJpa;

Теперь в контроллере я пытаюсь удалить одну строку из частей таблицы:

@PostMapping("deletePart")
public String deletePart(@RequestParam String id, Model model) {
    partsService.deleteById(Integer.parseInt(id));
    return "redirect:/parts";

} 

Но у меня есть исключение :

нарушение ограничения целостности: "FK9Y4MKICYBLJWPENACP4298I49: PUBLI C .PARTS FOREIGN KEY (ID_EXPORT) REFERENCES PUBLI C .EXPORT (ID) (1)"; SQL оператор: / * удалить com.aleksandr0412.demo.entitiesjpa.ExportJpa / удалить из ЭКСПОРТА, где id =? [23503-200]], SQL: / удалить com.aleksandr0412.demo.entitiesjpa.ExportJpa * / удалить из ЭКСПОРТА, где id =? 2020-05-25 19: 16: 31.630 ПРЕДУПРЕЖДЕНИЕ 13387 --- [nio-8080-exe c -4] ohengine.jdb c .spi.SqlExceptionHelper: SQL Ошибка: 23503, SQLState: 23503

В моей базе данных для этих сущностей у меня есть 3 таблицы: Parts, Spe c и Spec_parts. Насколько я понимаю, для решения этой проблемы я сначала должен удалить строки в таблице spec_parts, а после этого я могу удалить строку из частей таблицы. Как я могу это сделать?

1 Ответ

1 голос
/ 26 мая 2020

В вашей реализации partsService я бы рекомендовал вам сначала получить ресурс, который вы собираетесь удалить (i.e the PartsJpa), используя заданный id из контроллера. Затем установите для него specJpa значение null или emptySet, затем вызовите метод удаления.

Чтобы это сработало, убедитесь, что методы setSpecJpa(SpecJpa specJpa) и setPartJpa(PartJpa partJpa) реализованы правильно.

Надеюсь, вы найдете это полезным.

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