2016-06-08 2 views
1

У меня есть entityrelation вроде этого:JPA удалить все entites работает странно

В классе ParentObj:

@OneToMany(mappedBy = "parentObj", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) 
private List<ChildObj> list; 

В классе ChildObj:

@JoinColumn(name="PARENT_OBJ") 
@ManyToOne 
private ParentObj parentObj; 

Когда родительский объект сохраняется или удаляется, ребенок также сохраняется и удаляется. НО при попытке удалить все объекты с CriteriaDelete как:

CriteriaDelete<ParentObj> query = builder.createCriteriaDelete(ParentObj.class); 
      query.from(ParentObj.class); 
      em.createQuery(query).executeUpdate(); 

или простой запрос, как это:

em.createQuery("DELETE FROM ParentObj po").executeUpdate(); 

я получил ConstraintViolationException, может кто-нибудь объяснить, почему это происходит?

Я использую org.hibernate.ejb. HibernatePersistence поставщик с JTA Wildfly сервер.

ответ

2

Следующего

em.createQuery("DELETE FROM ParentObj po").executeUpdate(); 

является командой массового обновления JPQL и как язык JPQL ссылочного примечание:

10.2.9. JPQL Массовое обновление и удаление

Операции обновления и удаления Bulk операции применимы к объектам одного одного класса сущностей (вместе с его подклассов, если таковые имеются).

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

https://docs.oracle.com/html/E24396_01/ejb3_langref.html#ejb3_langref_bulk_ops

Поэтому в основном вы пытаетесь удалить объект, который, из-за отсутствия каскадирования, все равно будет иметь ссылки FK в базе данных. Отсюда исключение.

CriteriaDelete имеет аналогичные ограничения:

https://docs.oracle.com/javaee/7/api/javax/persistence/criteria/CriteriaDelete.html

Критерии API массовое удаление операция отображается непосредственно в базу данных операций удаления. Контекст сохранения не синхронизирован с результатом массового удаления.

+0

Спасибо за объяснение, есть ли способ удалить все объекты из таблицы элегантным способом? (В настоящее время я просто выбираю все из них и удаляю их в foreach.) – gaRos

+0

Применение каскадного удаления в базе данных - единственный вариант, о котором я знаю. –