Hibernate: как удалять сущности в отношениях «многие ко многим» с дополнительными атрибутами - PullRequest
2 голосов
/ 06 января 2020

У меня есть следующие отношения:

@OneToMany(fetch = FetchType.EAGER, mappedBy="note", cascade = CascadeType.REMOVE, orphanRemoval = true)
private Set<Review> reviews = new HashSet<>();

в Примечание. java и

@OneToMany(fetch = FetchType.EAGER, mappedBy = "expert", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Review> notes = new HashSet<>();

в Эксперт. java.

Как видите, они относятся к классу Review, который представляет отношение M к N между Note и Expert. Поскольку мне нужно было добавить дополнительные атрибуты в это отношение, я создал класс ReviewId и класс Review следующим образом:

@Embeddable
public class ReviewId implements Serializable {

    @Column(name = "fk_note")
    protected Long noteId;

    @Column(name = "fk_expert")
    protected Long expertId;

    [...]
}

@Entity
public class Review {
    @EmbeddedId
    private ReviewId id;

    private int value;

    private String comment;

    @ManyToOne
    @JoinColumn(name = "fk_note", insertable = false, updatable = false)
    private Note note;

    @ManyToOne
    @JoinColumn(name = "fk_expert", insertable = false, updatable = false)
    private Expert expert;

    [...]
}

Когда я пытаюсь удалить заметку или эксперта, которые появляются в этом отношении, я получить следующую ошибку:

Cannot delete or update a parent row: a foreign key constraint fails (`db_example`.`review`, CONSTRAINT `FKls65s9wl28v98ts2kifir37p7` FOREIGN KEY (`fk_note`) REFERENCES `note` (`id`))

Как я могу заставить Hibernate удалять все отзывы, связанные с определенной заметкой / экспертом, когда я их удаляю? Спасибо!

1 Ответ

0 голосов
/ 07 января 2020

Это можно сделать с помощью FluentJPA :

long noteId; //passed as a parameter

FluentQuery query = FluentJPA.SQL((Review review) -> {

    DELETE().FROM(review);
    WHERE(review.getId().getNoteId() == noteId);
});

...
query.createQuery(em).executeUpdate();

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