Есть ли способ позволить Hibernate обрабатывать удаление записи в ассоциации @ManyToMany, если я удаляю объект, не управляющий этой ассоциацией? - PullRequest
0 голосов
/ 06 декабря 2018

Есть ли способ позволить Hibernate обрабатывать удаление записи в JoinTable ассоциации @ManyToMany, если я удаляю сущность, которая не управляет этой ассоциацией?

Как я понимаю, если у меня есть@ManyToMany ассоциации, как это:

@Entity
public class AlertConfigurationVersion {

    @JoinTable(
                name = SUBJECT_ALERTCONFIGURATION_VERSION_TABLE,
                joinColumns = @JoinColumn(name = "alert_configuration_version_id"),
                inverseJoinColumns = @JoinColumn(name = "subject_id")
    @ManyToMany(cascade = {
                CascadeType.DETACH,
                CascadeType.MERGE,
                CascadeType.REFRESH,
                CascadeType.PERSIST})
    private Set<Subject> subjects = new HashSet<>();
}

Тогда, если я удаляю AlertConfigurationVersion, таблица @ManyToMany будет корректно обновляться для любых Subject s, указывающих на нее.

Но вВ моем случае я удаляю Subject (используя стандартный метод репозитория), и теперь я получаю неприятный org.hibernate.exception.ConstraintViolationException с базовым

org.postgresql.util.PSQLException: ERROR: update or delete on table "subject" violates foreign key constraint "fks123x93urj80014yg4vem4h43" on table "subject_alertconfigurationversion"
  Detail: Key (id)=(9b915613-f37d-45c2-8fd8-8da4f9291aea) is still referenced from table "subject_alertconfigurationversion".

Могу ли я разрешить Hibernate каким-либо образом обработать этот случай?В идеале НЕ делать эту ассоциацию двунаправленной, поскольку в этом нет необходимости для бизнес-логики.Я не думаю, что это все равно будет иметь значение.

Я использую Lombok для генерации хеш-кода и равных, но я также пытался исключить ссылки и / или идентификатор из них, основываясь на рекомендации на https://dev.to/alagrede/why-i-dont-want-use-jpa-anymore-fl и https://developer.jboss.org/wiki/EqualsAndHashCode?_sscc=t

Связанные: ManyToMany с каскадом все каскадно только в одну сторону , хотя это 5 лет назад и не привлекло большого внимания, может быть какой-то путь сейчас илидаже тогда.

Еще один связанный с этим вопрос: Hibernate каскадное удаление «многие ко многим» , я попробовал «взломать» в верхнем ответе, дублируя объединяемые таблицы, но это вызывает все другие видыпроблемы, и Влад Михальке специально говорит (в другом месте) НЕ делать этого.

Также есть открытая проблема в Hibernate на https://hibernate.atlassian.net/browse/HHH-12239, которая выглядит как моя проблема, поэтому кажется, что она распознается как ошибка, но я не уверен на 100%, что это относится к моей ситуации.Вопрос о двунаправленных ассоциациях.

1 Ответ

0 голосов
/ 06 декабря 2018

Как Hibernate может удалить связанные строки из SUBJECT_ALERTCONFIGURATION_VERSION_TABLE, когда объект Subject не знает об этой ассоциации?

Единственный способ решить эту проблему - использовать основанный на FK CASCADE ON DELETE:

ALTER TABLE SUBJECT_ALERTCONFIGURATION_VERSION_TABLE
ADD CONSTRAINT fk_alert_configuration_version_subject_id
FOREIGN KEY (subject_id) REFERENCES subject 
ON DELETE CASCADE
...