2016-06-08 7 views
1

ich eine entityrelation wie dieses:JPA löschen Sie alle entites arbeitet seltsam

In der parentObj Klasse:

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

In der ChildObj Klasse:

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

Wenn das übergeordnete Objekt beibehalten oder entfernt, wird das Kind auch persistiert/entfernt. ABER wenn ich versuche, alle Einheiten mit einem CriteriaDelete wie zu entfernen:

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

oder eine einfache Abfrage wie folgt:

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

ich ein ConstraintViolationException bekam, erklären könnte jemand, warum dies Ereignis?

Ich verwende org.hibernate.ejb. HibernatePersistence Anbieter mit JTA auf einem Wildfly Server.

Antwort

2

Die folgenden

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

ist ein Befehl Massenaktualisierung JPQL und als Referenznoten JPQL Sprache:

10.2.9. JPQL Bulk-Update und Delete

Operationen Bulk-Update und Delete-Operationen gelten für Einheiten einer Einheit Klasse (zusammen mit ihren Unterklassen, falls vorhanden).

Eine Löschoperation gilt nur für Entitäten der angegebenen Klasse und deren Unterklassen. Es kaskadiert nicht mit verwandten Entitäten. ....

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

Sie versuchen, eine Einheit, die aufgrund mangelnder Kaskadierung entfernen So im Wesentlichen, wird nach wie vor FK Referenzen in der Datenbank hat. Daher die Ausnahme.

CriteriaDelete hat ähnliche Einschränkungen:

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

Criteria API Bulk-Löschvorgänge direkt auf die Datenbank abzubilden Operationen löschen. Der Persistenzkontext ist nicht mit dem Ergebnis des Massenlöschvorgangs synchronisiert.

+0

Dank für die Erklärung, gibt es eine Möglichkeit, alle Entitäten auf elegante Weise aus einer Tabelle zu entfernen? (Zur Zeit wähle ich einfach alle aus und entferne sie in einer foreach.) – gaRos

+0

Apply kaskadieren löschen in der Datenbank ist die einzige Option, die ich kenne. –

Verwandte Themen