Как выполнять массовое удаление в JPA при использовании коллекций элементов?
У меня возникли проблемы с тем, как выполнять массовое удаление объекта Person с использованием JPA, когда объекты Person содержат данные, хранящиеся с помощью элемента @ElementCollection. Любые идеи о том, как это сделать, будут высоко оценены.
@Entity
@Table(name="at_person")
public class Person implements Comparable<Person> {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private long id = 0;
@Column(name="name", nullable = true, length = 128)
private String name = "";
@ElementCollection
@Column(name = "email")
@CollectionTable(name = "person_email", joinColumns = @JoinColumn(name = "person_id"))
private Set<String> email = new HashSet<String>();
}
То, что я делаю в данный момент, это, и он терпит неудачу с ошибкой ограничения внешнего ключа:
Query query=em.createQuery("DELETE FROM Person");
Вызвано: java.sql.SQLException: нарушение ограничений целостности: внешний ключ не действует; Таблица FKCEC6E942485388AB: PERSON_EMAIL
Если это может быть чистая аннотация JPA, а не аннотация Hibernate, которая была бы бонусом!
Ответы
Ответ 1
Я позволю вам интерпретировать часть спецификации JPA 2.0, в которой упоминается, что операция массового удаления не каскадируется:
4.10 Операции массового обновления и удаления
...
Операция удаления применяется только к объекты указанного класса и его подклассов. Он не каскадирует связанных лиц.
И дело в том, что Hibernate не будет каскадировать удаление в таблицу коллекции. Об этом сообщается в HHH-5529, и предлагаемые подходы:
Вы также можете (a) самостоятельно очистить таблицу сбора или (b) использовать в схеме каскадные внешние ключи.
Другими словами, (a) использовать собственный SQL или (b) использовать ограничение каскадного удаления на уровне базы данных - и вам придется добавлять его вручную, я не думаю, что вы можете использовать @OnDelete
с аннотацией @ElementCollection
(такая же история, как HHH-4301 IMO).