Как игнорировать уникальное нарушение при вставке списка объектов, содержащих набор объектов

Я использую PostgreSQL и данные Spring JPA с Hibernate. У меня есть отношение OneToMany с orphanRemoval = false, потому что я очень часто добавляю в отношение много дочерних элементов.

Родитель:

@OneToMany (mappedBy = "parent", cascade = {CascadeType.ALL}, orphanRemoval = false, fetch = FetchType.LAZY) public Set getChildren () {return children; }

Ребенок:

@ManyToOne @JoinColumn (name = "parent_id") public Parent getParent () {return parent; }

Чтобы сохранить или объединить объект, я использую метод

Iterable ‹T> save (Iterable‹ расширяет T> объекты)

сформируйте CrudRepository. Я сохраняю список родителей, где каждый родитель содержит набор дочерних элементов. Дочерняя таблица имеет уникальное ограничение. Если происходит нарушение ограничений, я хочу проигнорировать это и опустить (не сохранять) дочерний элемент, который вызывает нарушения, но я хочу вставить каждого дочернего элемента, который не вызывает нарушения ограничения. Как это сделать?


person Mariusz    schedule 18.09.2012    source источник


Ответы (2)


Обработайте это грязным с помощью исключений.

  1. Попробуй Обновить БД, если тут нормально ломается. Перехватите исключение UniqueViolationException и найдите JDBCException. Выполните обновление до вашего квалифицированного исключения базы данных и найдите неработающие дочерние элементы.

  2. Удалите детей из родителя.

  3. Go to 1.

person Grim    schedule 18.09.2012

Чистый способ - отфильтровать Сущности, которые будут создавать исключения-нарушения-уникальности. После того, как вы отфильтровали эти объекты, вы можете сохранить хорошие.

Исключения следует использовать так, как они есть на самом деле: Исключения.

person Grim    schedule 18.09.2012
comment
Я согласен с вами, но в этом сценарии я должен выбрать всех дочерних элементов из базы данных перед вставкой. Это приводит к большему количеству операций. Я специально установил для orphanRemoval значение false, чтобы этого избежать. Я новичок в ORM и заметил, что если вас не волнует количество операций и сложность, ORM прост в использовании. Но если вы хотите сократить ненужные операции, тогда возникают проблемы. - person Mariusz; 18.09.2012
comment
если вас не волнует количество операций, то xxx легко использовать., xxx может быть любой абстракцией: jni, ajax, sql, http, очереди, информационные бюллетени, рыбалка, борьба, расчистка лабиринта;) - person Grim; 18.09.2012
comment
Это не чистый способ, потому что кто-то может добавлять новые объекты в другую транзакцию, и вы все равно можете получить уникальное исключение нарушения. - person mpr; 11.07.2018
comment
@mpr Вы имеете в виду уникальные исключения нарушения ограничений. Вот почему у нас есть I в КИСЛОТЕ. Но вы правы: отложенные ограничения и грязное чтение могут создать такое нарушение против ACID. - person Grim; 11.07.2018
comment
Я ничего не писал о грязных чтениях и отложенных ограничениях. В описанном вами подходе к уровню изоляции транзакции «прочитанная фиксация» также не работает. - person mpr; 11.07.2018