Удаление объекта JPA не удается из-за ограничений иностранных ключей?
Вопрос
Почему следующий запрос выходит из строя из-за ограничения внешнего ключа? Для меня нет другого способа удалить связанные данные, о которых я знаю.
Query query=em.createQuery("DELETE FROM Person");
query.executeUpdate();
em.getTransaction().commit();
Я считаю, что оскорбительные отношения, вызывающие проблему, это activationKey
поле:
2029 [main] ERROR org.hibernate.util.JDBCExceptionReporter - integrity
constraint violation: foreign key no action; FKCEC6E942485388AB
table: ACTIVATION_KEY
Это то, что у меня сейчас:
@Entity
@Table(name="person")
public class Person implements Comparable<Person> {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
private long id = 0;
@ElementCollection
@Column(name = "activation_key")
@CollectionTable(name = "activation_key")
private Set<String> activationKey = new HashSet<String>();
}
Решение
Почему следующий запрос выходит из строя из-за ограничения внешнего ключа?
Похоже, ваша оптовая удаление запроса не удаляет записи из таблицы сбора, поэтому нарушение ограничения FK.
И пока JPA SPEC явно пишет, что объемное удаление не кашатся к связанным объектам:
4.10 Обновление Обновления и удаление
...
Удаление операции относится только к объектам указанного класса и его подклассов. Это не каскадно для связанных объектов.
Это не совсем твой случай, и я думаю, что то, что вы хотите сделать, следует поддерживать.
Вы, вероятно, сталкиваетесь с одним из ограничений SULK Hibernate Sulk Delete, см. Например:
- HHH-3337 - Hibernate игнорирует @obointable при генерировании объемного обновления / удаления для самостоятельной сущности
- HHH-1917 - навальная удаление на владеющей стороне многотоманских отношений, должна удалить соответствующие строки из сопряженного
Я предлагаю повысить проблему.
Обходной путь: используйте нативные запросы, чтобы удалить таблицу сбора, а затем таблицу объекта.