Ограничение внешнего ключа JPA с помощью CascadeType.ALL - PullRequest
0 голосов
/ 14 мая 2018

У меня есть 2 сущности

Это первая сущность

public class Manager {

    // ...

    @OneToMany(mappedBy = "manager", cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<ExpertAndRequest> requests;

    // ...

}

Вторая сущность. Это таблица привязки двух сущностей.

@Entity
@Data
@Table(name = "SOME_TABLE_NAME")
@IdClass(ExpertAndRequestId.class)
public class ExpertAndRequest implements Serializable {

    @Id
    private Long managerId;

    @Id
    private Long requestId;


    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "managerId", updatable = false, insertable = false, referencedColumnName = "id")
    private Manager manager;


    @ManyToOne
    @JoinColumn(name = "requestId", updatable = false, insertable = false, referencedColumnName = "id")
    private ParticipantRequest request;



}

Поэтому я удаляю данные из таблицы

this.managerRepository.delete(manager);        

И я получаю исключение:

org.h2.jdbc.JdbcSQLException: Referential integrity constraint violation

Что я делаю не так?


РЕДАКТИРОВАТЬ :

Я обновил класс выше.

Это IdClass

@Data
public class ExpertAndRequestId implements Serializable {

    private long managerId;
    private long requestId;


    public int hashCode() {
        return (int)(managerId + requestId);
    }

    public String toString() {

        return String.format("ExpertAndRequestId [expert = \"%s\", request=\"%s\"]", this.managerId, this.requestId);

    }

    public boolean equals(Object object) {
        if (object instanceof ExpertAndRequestId) {
            ExpertAndRequestId otherId = (ExpertAndRequestId) object;
            return (otherId.requestId == this.requestId) && (otherId.managerId == this.managerId);
        }
        return false;
    }

}

Третье лицо

public class ParticipantRequest {

    // ...

    @OneToMany(mappedBy = "request", cascade = CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<ExpertAndRequest> experts;

    // ...

}

Пример, который я взял из https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Поскольку у вас есть двунаправленное отношение между Родителем-сущностью Manager и Дочерней-сущностью ExpertAndRequest, вам нужно CascadeType.REMOVE (или CascadeType.ALL, который включает REMOVE): вы говорите Hibernate ", если родительская сущность удалена, пожалуйста, удалите и дочернюю сущность ". Возьмите llo здесь , чтобы понять, как использовать CascadeType.REMOVE и orphanRemoval

0 голосов
/ 14 мая 2018

попробуйте cascade = {CascadeType.PERSIST, CascadeType.MERGE} вместо cascade = CascadeType.ALL и возьмите этот сайт в качестве ссылки.

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