Как выполнить массовое удаление в JPA при использовании коллекций элементов? - PullRequest
14 голосов
/ 11 октября 2010

У меня возникают проблемы при разработке способа массового удаления объекта 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 Ответ

29 голосов
/ 11 октября 2010

Я позволю вам интерпретировать часть спецификации JPA 2.0, в которой упоминается, что операция массового удаления не является каскадной:

4.10 Операции массового обновления и удаления

...

Операция удаления применяется только к сущности указанного класса и его подклассы. Это не каскад связанные лица .

И дело в том, что Hibernate также не будет каскадно удалять таблицу сбора. Об этом сообщается в HHH-5529 , и предлагаются следующие подходы:

Вы также можете (а) очистить таблицу сбора самостоятельно или (б) использовать в схеме каскадные внешние ключи.

Другими словами, (a) использовать собственный SQL или (b) использовать ограничение каскадного удаления на уровне базы данных - и вам придется добавить его вручную, я не думаю, вы можете используйте @OnDelete с аннотацией @ElementCollection (та же история, что и HHH-4301 IMO).

...